作者 堀江 v伸一

心のトキメキとのリズムとともに自転車をこいでいく、家族の中心でにこやかに笑い。
ご近所さんで評判の。
地元で愛されそ街かどや都会の雑踏の中にその姿を見出せる。
平和な国のもと伸び伸びと生活し、世界のどこかで同じ空を見上げている。

そんな貴方に出会う旅に出かけてもいいでしょうか?




こんな自作のポエムもいいですが勉強もよいものです。

今日の勉強です。

アトムを要素として持つ集合が与えられるので、そのべき集合を求めるプログラム。
unique述語は借り物だけど、power_set述語は一応自分で考えた方法でコードを書いてみた。
uniqueを消し去ってもよかったのだが分かりにくくなると思ったのでこのへんでストップ。
歯車が回るようにコトコト関数の中で結果を渡して一回転したら上に戻すイメージ。


unique([], []).
unique([H|T], UT) :- member(H, T),!, unique(T, UT).
unique([H|T], [H|UT]) :- unique(T, UT).
power_set(X,Y):-unique(X,X1),power_set(X1,[],[],Y).
power_set([],Perm,Temp,[Perm|Temp]).
power_set([X|Rest],Perm,Temp,Result):-
	power_set(Rest,[X|Perm],Temp,Re1),
	power_set(Rest,Perm,Re1,Result).

元の問題文
6.16 A が集合だとするとき、A のすべての部分集合から構成される集合のことを、A の「べき集合」(power set) と呼びます。
たとえば、
[a, b, c]
というリストによってあらわされる集合のべき集合は、
[[], [a], [b], [c], [a, b], [a, c], [b, c], [a, b, c]]
というリストによってあらわされる集合です。
L がリストだとするとき、power_set(L, P) というゴールで呼び出すと、L が集合をあらわしていると解釈したときの L のべき集合をあらわすリストを求めて、
その結果と P とを単一化する、 power_set/2 という述語の定義を書いてください。
実行例 ?- power_set([a, b, b, c], X).
X = [[], [c], [b], [b, c], [a], [a, c], [a, b], [a, b, c]]



17日目のProlog勉強
小学校の算数までしかできないと創価学会員のかたからうわさを流されている堀江伸一こと私の今日の勉強内容です。
今日はPrologでライツアウトの最長手数をもとめるプログラムを書いたら遅いしメモリを取るしでいいプログラムが書けませんでした。
今日書いたプログラムは以下の通り。

push_button2(N,State,NextState):-
R is N // 5,
C is N mod 5,
nth0(C,[3,7,14,28,24],XorM),
nth0(C,[1,2,4,8,16],XorU),
XorM1 is XorM<<(5*R),
(R>0 -> XorU1 is XorU<<(5*(R-1));XorU1 is 0),
(R<4 -> XorD1 is XorU<<(5*(R+1));XorD1 is 0),
NextState is State xor (XorU1 \/ XorM1 \/ XorD1).

b_search(_,Down,Up,_):-Up<Down,fail.
b_search(List,Down,Up,No):-
Down=<Up,
M is (Down+Up)//2,
nth0(M,List,X),
(X<No->Down1 is M+1,b_search(List,Down1,Up,No);true),
(X>No->Up1 is M-1,b_search(List,Down,Up1,No);true),
true.
push_one(NowList,OldList,NextState,OldSize,NowSize):-
select(State,NowList,_),
between(0,24,N),
push_button2(N,State,NextState),
not(b_search(OldList,0,OldSize,NextState)),
not(b_search(NowList,0,NowSize,NextState)),
true.

next_search(P,OldList,Now):-
length(Now,NowSize),
length(OldList,OldSize),
NowSize1 is NowSize-1,
OldSize1 is OldSize-1,
write([P,NowSize]),
P<4,
findall(State,(push_one(Now,OldList,State,OldSize1,NowSize1)),Next),
sort(Next,Next1),
write('ok'),nl,
P1 is P+1,
next_search(P1,Now,Next1).
+ タグ編集
  • タグ:
  • 堀江伸一
  • 小学校の算数までしかできない

このサイトはreCAPTCHAによって保護されており、Googleの プライバシーポリシー利用規約 が適用されます。

最終更新:2013年06月14日 21:17