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