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

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

prolog勉強18日目 六望星のフィリップイットスターを解くプログラム - (2013/06/14 (金) 23:59:52) の1つ前との変更点

追加された行は青色になります

削除された行は赤色になります。

+Prolog勉強18日目。
+小学校の算数までしかできないと創価学会の方に噂を流されている堀江伸一こと私の勉強日記。
+今日はリンク先のパズル問題を解くコードをPrologで書いてみた。
 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]]).