katsu #1350(2007/07/22 14:33 GMT) [ Prolog ] Rating2/2=1.00
prologなのに全解探索しないなんてことはありません。 実行例 $ pl -qs amida.pl ?- test(R). a b c d | | |-| | |-| | | | |-| | |-| | |-| | | | |-| | | | |-| | |-| | |-| | | | |-| | |-| | | | |-| | d c b a R = 14 ; a b c d | | |-| | |-| | | | |-| | |-| | |-| | | | |-| | | | |-| | |-| | |-| | | | |-| | |-| |-| | |-| | | | |-| | |-| | | | |-| d c b a R = 17 ; a b c d | | |-| | |-| | | | |-| | |-| | |-| | | | |-| | | | |-| | |-| | |-| |-| | |-| | | | |-| | |-| | |-| | | | |-| | | | |-| | |-| | | | |-| d c b a R = 19 ...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
amida(A,B,R):-amida(0,A,B,[A],[],R). amida(_,A,A,_,_,[]). amida(N,A,B,H,Pb,[Bar|Rs]):- length(A,An), succ(Ann,An), bars(Ann,Bar), likes(Pb,Bar), trans(Pb,Bar), permute(Bar,A,As), not(member(As,H)), succ(N,N1), amida(N1,As,B,[As|H],Bar,Rs). likes([],_):-!. likes([1|_],[1|_]):-!,fail. likes([_|As],[_|Bs]):-!,likes(As,Bs). trans([],_):-!. trans([_,_],[_,_]):-!. trans([1,0,0|_],[0,0,1|_]):-!,fail. trans([0,0,1|_],[1,0,0|_]):-!,fail. trans([_|As],[_|Bs]):-!,trans(As,Bs). bars(0,[],1):-!. bars(0,_,0):-!,fail. bars(1,[1],0). bars(N,[B|Bs],F):-between(0,1,B), (B=:=1 ->(N=:=1 ->Bs=[] ; Bs=[0|Bss],plus(Ns,2,N),bars(Ns,Bss,1)) ; succ(Ns,N), bars(Ns,Bs,F)). bars(0,[]):-!. bars(N,[B|Bs]):-between(0,1,B), (B=:=1 ->(N=:=1 ->Bs=[] ; Bs=[0|Bss],plus(Ns,2,N),bars(Ns,Bss)) ; succ(Ns,N), bars(Ns,Bs)). permute([],[A],[A]). permute([1],[A1,A2],[A2,A1]). permute([1,0|B],[A1,A2|As],[A2,A1|Rs]):-!,permute(B,As,Rs). permute([0|B],[A|As],[A|Rs]):-!,permute(B,As,Rs). writeamida(A,B,P):-amida(A,B,R),writea(R,P0),concat_atom(A,' ',S),concat_atom(B,' ',G),P2=[S|P0],append(P2,[G],P). writea([],[]). writea([B|Bs],[Pss|Ps]):-writebar(B,P),string_concat('|',P,Pss),writea(Bs,Ps). writebar([],''). writebar([1|Bs],Ps):-writebar(Bs,P),string_concat('-|',P,Ps). writebar([0|Bs],Ps):-writebar(Bs,P),string_concat(' |',P,Ps). test(L):-writeamida([a,b,c,d],[d,c,b,a],R),maplist(writeln,R),length(R,L).
Rating2/2=1.00-0+
[ reply ]
katsu
#1350()
[
Prolog
]
Rating2/2=1.00
amida(A,B,R):-amida(0,A,B,[A],[],R). amida(_,A,A,_,_,[]). amida(N,A,B,H,Pb,[Bar|Rs]):- length(A,An), succ(Ann,An), bars(Ann,Bar), likes(Pb,Bar), trans(Pb,Bar), permute(Bar,A,As), not(member(As,H)), succ(N,N1), amida(N1,As,B,[As|H],Bar,Rs). likes([],_):-!. likes([1|_],[1|_]):-!,fail. likes([_|As],[_|Bs]):-!,likes(As,Bs). trans([],_):-!. trans([_,_],[_,_]):-!. trans([1,0,0|_],[0,0,1|_]):-!,fail. trans([0,0,1|_],[1,0,0|_]):-!,fail. trans([_|As],[_|Bs]):-!,trans(As,Bs). bars(0,[],1):-!. bars(0,_,0):-!,fail. bars(1,[1],0). bars(N,[B|Bs],F):-between(0,1,B), (B=:=1 ->(N=:=1 ->Bs=[] ; Bs=[0|Bss],plus(Ns,2,N),bars(Ns,Bss,1)) ; succ(Ns,N), bars(Ns,Bs,F)). bars(0,[]):-!. bars(N,[B|Bs]):-between(0,1,B), (B=:=1 ->(N=:=1 ->Bs=[] ; Bs=[0|Bss],plus(Ns,2,N),bars(Ns,Bss)) ; succ(Ns,N), bars(Ns,Bs)). permute([],[A],[A]). permute([1],[A1,A2],[A2,A1]). permute([1,0|B],[A1,A2|As],[A2,A1|Rs]):-!,permute(B,As,Rs). permute([0|B],[A|As],[A|Rs]):-!,permute(B,As,Rs). writeamida(A,B,P):-amida(A,B,R),writea(R,P0),concat_atom(A,' ',S),concat_atom(B,' ',G),P2=[S|P0],append(P2,[G],P). writea([],[]). writea([B|Bs],[Pss|Ps]):-writebar(B,P),string_concat('|',P,Pss),writea(Bs,Ps). writebar([],''). writebar([1|Bs],Ps):-writebar(Bs,P),string_concat('-|',P,Ps). writebar([0|Bs],Ps):-writebar(Bs,P),string_concat(' |',P,Ps). test(L):-writeamida([a,b,c,d],[d,c,b,a],R),maplist(writeln,R),length(R,L).Rating2/2=1.00-0+
[ reply ]