「prolog勉強18日目 六望星のフィリップイットスターを解くプログラム」の編集履歴(バックアップ)一覧に戻る

prolog勉強18日目 六望星のフィリップイットスターを解くプログラム - (2013/06/14 (金) 23:58:48) のソース

http://www.geocities.jp/m_hiroi/puzzle/flip_it.html

Prolog勉強18日目。
小学校の算数までしかできないと噂を流されている堀江伸一こと私の勉強日記。
今日はリンク先の問題をPrologで書いてみた。
とりあえず書きあげてこれからテストという段階で、内容は全く未検証。
今日の挑戦は手続き的なアプローチから脱却するためのコードの書き方の模索。
今日のコードは失敗だった気がする。
事実の定義がめんどくさいことになっていてもう少し賢く書けそうな気がする。
これだけ事実を書いたら書き間違いの一つや二つ入ってるのは確実。

そのプログラム言語の記述力はパズル(競技プログラムに出てくるような問題や数学的問題も含む)を解く能力によって量ることが出来るという有名な数学者による格言があります。
逆に言えば、パズルを解く記述を書けるなら色々な問題を解く土台を勉強してるのと同じだということです。

プログラムを勉強するときの練習問題としてパズルを題材に取っているだけで、パズルを解くために色々実用的なプログラムテクニックが身につくそうです。
後はプログラムテクニックを実用品ソフトに応用できる他の学問と連携できる知識や経験などですかね。



 %
 %____A
 %B_C___D_E
 %_F_____G
 %H_I___J_K
 %____L
 %C,D,F,G,I,J
 change(b,w).
 change(w,b).
 %C to E
 move_table([A,B,C,D,s,F,G,H,I,J,K,L],[A,B,s,D1,C,F,G,H,I,J,K,L]):-
 	change(D,D1).
 
 
 %C to H
 move_table([A,B,C,D,E,F,G,s,I,J,K,L],[A,B,s,D,E,F1,G,C,I,J,K,L]):-
 	change(F,F1).
 
 
 %D to B
 move_table([A,s,C,D,E,F,G,H,I,J,K,L],[A,D,C1,s,E,F,G,H,I,J,K,L]):-
         change(C,C1).
 
 %D to K
 move_table([A,B,C,D,E,F,G,H,I,J,s,L],[A,B,C,s,E,F,G1,H,I,J,D,L]):-
 	change(G,G1).
 
 
 %G to A
 move_table([s,B,C,D,E,F,G,H,I,J,K,L],[G,B,C,D1,E,F,s,H,I,J,K,L]):-
 	change(D,D1).
 
 
 %G to L
 move_table([A,B,C,D,E,F,G,H,I,J,K,s],[A,B,C,D,E,F,s,H,I,J1,K,G]):-
 	change(J,J1).
 
 
 %J to E
 move_table([A,B,C,D,s,F,G,H,I,J,K,L],[A,B,C,D,J,F,G1,H,I,s,K,L]):-
 	change(G,G1).
 %J H
 move_table([A,B,C,D,E,F,G,s,I,J,K,L],[A,B,C,D,E,F,G,J,I1,s,K,L]):-
 	change(I,I1).
 
 %K I
 move_table([A,B,C,D,E,F,G,H,s,J,K,L],[A,B,C,D,E,F,G,H,K,J1,s,L]):-
 	change(J,J1).
 
 %B to I
 move_table([A,B,C,D,E,F,G,H,s,J,K,L],[A,s,C,D,E,F1,G,H,B,J,K,L]):-
 	change(F,F1).
 
 %L to F
 move_table([A,B,C,D,E,s,G,H,I,J,K,L],[A,B,C,D,E,L,G,H,I1,J,K,s]):-
 	change(I,I1).
 
 %F to A
 move_table([s,B,C,D,E,F,G,H,I,J,K,L],[F,B,C1,D,E,s,G,H,I,J,K,L]):-
 	change(C,C1).
 
 
 
 %B to L
 move_table([A,B,C,D,E,F,G,H,I,J,K,s],[A,s,C,D,E,F1,G,H,I1,J,K,B]):-
 	change(I,I1),change(F,F1).
 %L to E
 move_table([A,B,C,D,s,F,G,H,I,J,K,L],[A,B,C,D,L,F,G1,H,I,J1,K,s]):-
 	change(G,G1),change(J,J1).
 %E to B
 move_table([A,s,C,D,E,F,G,H,I,J,K,L],[A,E,C1,D1,s,F,G,H,I,J,K,L]):-
 	change(C,C1),change(D,D1).
 
 %H to A
 move_table([s,B,C,D,E,F,G,H,I,J,K,L],[H,B,C1,D,E,F1,G,s,I,J,K,L]):-
 	change(C,C1),change(F,F1).
 %K to A
 move_table([s,B,C,D,E,F,G,H,I,J,K,L],[K,B,C,D1,E,F,G1,H,I,J,s,L]):-
 	change(D,D1),change(G,G1).
 %K to H
 move_table([A,B,C,D,E,F,G,s,I,J,K,L],[A,B,C,D,E,F,G,K,I1,J1,s,L]):- 
 	change(I,I1),change(J,J1).
 
 w_count([],0):-!.
 w_count([X|Rest],Result):-X==w,!,w_count(Rest,Re),Result is Re +1.
 w_count([_|Rest],Result):-w_count(Rest,Result). 
 
 
 next_search(P,Limit,[State|Rest]):-
 	write([State|Rest]),nl,
 	P<Limit,
         w_count(State,WC),
 	WC=:=11,
 	!,write([State|Rest]).
 next_search(P,Limit,[State|Rest]):-
 	P<Limit,
 	move_table(State,NextState),
 	P1 is P+1,
        not(member(NextState,Rest)),
 	next_search(P1,Limit,[NextState,State|Rest]).
 
 main:-between(1,10,N),
 	next_search(0,N,[[s,b,b,b,b,b,b,b,b,b,b,b]]).