※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。

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

prolog勉強18日目 六望星のフィリップイットスターを解くプログラム - (2013/06/14 (金) 23:53:35) の編集履歴(バックアップ)



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