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

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

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]]).