Comment detail

逆順になるあみだくじ (Nested Flatten)
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).

Index

Feed

Other

Link

Pathtraq

loading...