「prolog勉強15日目 小町算や大町算を解くプログラム」の編集履歴(バックアップ)一覧に戻る

prolog勉強15日目 小町算や大町算を解くプログラム - (2013/06/09 (日) 17:52:26) のソース

http://tutorial.jp/prog/prolog/prolog.pdf
こちらの大学生向けだと思われるPrologの勉強用資料。
power_set関数を自力で思いつけなかった。
全部の部分集合は得られるのだが[]がネストする形でしかコードを書けず平らなリストにすることが出来なかった。
答えはきっと物凄く短いのでは?
と考えて考え過ぎたのが敗因。
後継関数などの数学的処理は結構自力でいけたんだけどな。





http://www.geocities.jp/m_hiroi/puzzle/number.html#back0
小町算や大町算をPrologで解くプログラム。
リストを文字コードに変える処理がよくわからなかったので数からリストを生成したり。
大町算のコードがなにか冗長な感じがしたり色々まだまだな感じ。
まだまだってことは成長の余地が残ってることだと信じたい。

 selects([],Y,Y).
 selects([X|Rest],Y,Result):-select(X,Y,RestY),selects(Rest,RestY,Result).
 check([],[]).
 check([X|RestN],CodeL):-select(X,CodeL,RestL),check(RestN,RestL).
 
 check_zyunnbi(N,L):-integer(N),atom_codes(N,CodeN),atom_codes(L,CodeL),
 			check(CodeN,CodeL).
 %M/N
 komati1or2(M,N,AnsL,AnsR):-
 			selects([A,B,C,D],[1,2,3,4,5,6,7,8,9],[E,F,G,H,I]),
 			AnsL is A*1000+B*100+C*10+D,
 			AnsL*N mod M=:=0,
 			AnsR is AnsL*N//M,
  			CheckNo is E*10000+F*1000+G*100+H*10+I,
 			check_zyunnbi(AnsR,CheckNo).
 komati3(AnsL,AnsR):-
 		selects([A,B,C],[1,2,3,4,5,6,7,8,9],[E,F,G,H,I,J]),
 		AnsL is (A*100+B*10+C),
 		AnsR is AnsL*AnsL,
 		CheckNo is E*100000+F*10000+G*1000+H*100+I*10+J,
 		check_zyunnbi(AnsR,CheckNo).
 
 komati4(AnsL,AnsR):-
  	create_perm([A,B,C,D,E],[0,1,2,3,4,5,6,7,8,9]),
 	AnsL is A*10000+B*1000+C*100+D*10+E,
 	AnsR is AnsL*AnsL,
 	check_zyunnbi(AnsR,123456789).
 	
 create_perm([],Y).
 create_perm([X|Rest],Y):-select(X,Y,Z),create_perm(Rest,Y).
 
 
 %答えの表示
 oomati([],[+|Ans],999,0):-!,oomati([],[0,+ | Ans],999,0).
 oomati([],[-|Ans],999,0):-!,oomati([],[0,- | Ans],999,0).
 oomati([],Ans,999,0):-reverse(Ans,[A|Last]),!,write(Last),nl,fail. 
 
 %最後の数を確定する
 oomati([],[+ | Ans],Sum,X):-Sum1 is Sum+X,oomati([],[X,+|Ans],Sum1,0).
 oomati([],[- | Ans],Sum,X):-Sum1 is Sum-X,oomati([],[X,-|Ans],Sum1,0).
 
 %ここでXを確定する
 oomati([N|Nums],[+|Ans],Sum,X):-Sum1 is Sum+X,oomati(Nums,[+,X,+ | Ans],Sum1,N).
 oomati([N|Nums],[+|Ans],Sum,X):-Sum1 is Sum+X,oomati(Nums,[-,X,+ | Ans],Sum1,N).
 oomati([N|Nums],[-|Ans],Sum,X):-Sum1 is Sum-X,oomati(Nums,[+,X,- | Ans],Sum1,N).
 oomati([N|Nums],[-|Ans],Sum,X):-Sum1 is Sum-X,oomati(Nums,[-,X,- | Ans],Sum1,N).
 
 %数字を繋げる
 oomati([N|Nums],Ans,Sum,X):-X1 is X*10+N,oomati(Nums,Ans,Sum,X1).
 oomati:-oomati([8,7,6,5,4,3,2,1,0],[+],0,9).