プログラム断片(2008/06/02)

for VisualWorks 7.6 with Jun780, Prologインタプリタのマニュアル(PDF)

リストのユニフィケーション

?- remove.
tree([hen,cat,dog]).
?- clear, listing.
?- tree(X).
?- tree([A|D]).
?- tree([A,B|D]).
?- tree([A,B,C|D]).
?- tree([A|[B|[C|D]]]).
?- tree([A,B,C]).
01
tree([hen,cat,dog]).
yes
?- tree(X).
X = [hen,cat,dog] ;
no
?- tree([A|D]).
A = hen ,
D = [cat,dog] ;
no
?- tree([A,B|D]).
A = hen ,
B = cat ,
D = [dog] ;
no
?- tree([A,B,C|D]).
A = hen ,
B = cat ,
C = dog ,
D = [] ;
no
?- tree([A,B,C|D]).
A = hen ,
B = cat ,
C = dog ,
D = [] ;
no
?- tree([A,B,C]).
A = hen ,
B = cat ,
C = dog ;
no

carとcdrを述語に

?- remove.
car([A|D],A).
car([],[]).
?- clear, listing.
?- car([1,2,3],1).
?- car([],[]).
?- car([1,2,3],X).
?- car([],X).
?- car([X,2,3],1).
?- car(a,X).
?- car(123,X).
02
car([A|D],A).
car([],[]).
yes
?- car([1,2,3],1).
yes
?- car([],[]).
yes
?- car([1,2,3],X).
X = 1 ;
no
?- car([],X).
X = [] ;
no
?- car([X,2,3],1).
X = 1 ;
no
?- car(a,X).
no
?- car(123,X).
no
?- remove.
cdr([A|D],D).
cdr([],[]).
?- clear, listing.
?- cdr([1,2,3],[2,3]).
?- cdr([],[]).
?- cdr([1,2,3],X).
?- cdr([],X).
?- cdr([1|X],[2,3]).
?- cdr(a,X).
?- cdr(123,X).
03
cdr([A|D],D).
cdr([],[]).
yes
?- cdr([1,2,3],[2,3]).
yes
?- cdr([],[]).
yes
?- cdr([1,2,3],X).
X = [2,3] ;
no
?- cdr([],X).
X = [] ;
no
?- cdr([1|X],[2,3]).
X = [2,3] ;
no
?- cdr(a,X).
no
?- cdr(123,X).
no

Prologのリスト表記に

11
?- remove.
?- clear, listing.
?- =(X,[A,B,6]), =(A,[1|2]), =(B,[C|5]), =(C,[3,4]).
04
yes
?- =(X,[A,B,6]), =(A,[1|2]), =(B,[C|5]), =(C,[3,4]).
A = [1|2] ,
B = [[3,4]|5] ,
C = [3,4] ,
X = [[1|2],[[3,4]|5],6] ;
no

N分木を2進木で

12
?- remove.
tree(A) :- 
        =(A,[B,c,d,E]), 
        =(B,[F,g,H]), 
        =(E,[I,J]), 
        =(F,[k,L]), 
        =(H,[m]), 
        =(I,[n]), 
        =(J,[o,P,q]),
        =(L,[r,s,t,u]),
        =(P,[v,w,x,y,z]).
?- clear, listing.
?- tree([[[k,L],g,[m]],c,d,[[n],[o,P,q]]]).
?- tree([[F,g,H],c,d,[I,J]]).
?- tree([B,c,d,E]).
?- tree(A).
05
tree(A) :- 
        =(A,[B,c,d,E]), 
        =(B,[F,g,H]), 
        =(E,[I,J]), 
        =(F,[k,L]), 
        =(H,[m]), 
        =(I,[n]), 
        =(J,[o,P,q]), 
        =(L,[r,s,t,u]), 
        =(P,[v,w,x,y,z]).
yes
?- tree([[[k,L],g,[m]],c,d,[[n],[o,P,q]]]).
L = [r,s,t,u] ,
P = [v,w,x,y,z] ;
no
?- tree([[F,g,H],c,d,[I,J]]).
F = [k,[r,s,t,u]] ,
H = [m] ,
I = [n] ,
J = [o,[v,w,x,y,z],q] ;
no
?- tree([B,c,d,E]).
B = [[k,[r,s,t,u]],g,[m]] ,
E = [[n],[o,[v,w,x,y,z],q]] ;
no
?- tree(A).
A = [[[k,[r,s,t,u]],g,[m]],c,d,[[n],[o,[v,w,x,y,z],q]]] ;
no

匿名変数の効用

?- remove.
likes(john, apple).
likes(john, wine).
likes(john, mary).
likes(mary, wine).
likes(mary, john).
?- clear, listing.
?- likes(X,Y).
?- likes(X,~).
?- likes(~,Y).
?- likes(X,~), write(X), nl, fail.
?- likes(~,Y), write(Y), nl, fail.
06
likes(john,apple).
likes(john,wine).
likes(john,mary).
likes(mary,wine).
likes(mary,john).
yes
?- likes(X,Y).
X = john ,
Y = apple ;
X = john ,
Y = wine ;
X = john ,
Y = mary ;
X = mary ,
Y = wine ;
X = mary ,
Y = john ;
no
?- likes(X,~).
X = john ;
X = john ;
X = john ;
X = mary ;
X = mary ;
no
?- likes(~,Y).
Y = apple ;
Y = wine ;
Y = mary ;
Y = wine ;
Y = john ;
no
?- likes(X,~), write(X), nl, fail.
john
john
john
mary
mary
no
?- likes(~,Y), write(Y), nl, fail.
apple
wine
mary
wine
john
no

あるリストはこの要素を含んでいる

?- remove.
includes([X|~],X).
includes([~|Y],X) :- includes(Y,X).
?- clear, listing.
?- includes([hen,cat,dog,donkey],hen).
?- includes([hen,cat,dog,donkey],cat).
?- includes([hen,cat,dog,donkey],monkey).
?- includes([hen,cat,dog,donkey],X).
?- includes(X,dog).
07
includes([X|~],X).
includes([~|Y],X) :- 
        includes(Y,X).
yes
?- includes([hen,cat,dog,donkey],hen).
yes
?- includes([hen,cat,dog,donkey],cat).
yes
?- includes([hen,cat,dog,donkey],monkey).
no
?- includes([hen,cat,dog,donkey],X).
X = hen ;
X = cat ;
X = dog ;
X = donkey ;
no
?- includes(X,dog).
X = [dog|~] ;
X = [~,dog|~] ;
X = [~,~,dog|~] ;
X = [~,~,~,dog|~] ;
X = [~,~,~,~,dog|~] ;
X = [~,~,~,~,~,dog|~] ;
X = [~,~,~,~,~,~,dog|~] ;
X = [~,~,~,~,~,~,~,dog|~] ;
X = [~,~,~,~,~,~,~,~,dog|~] ;
X = [~,~,~,~,~,~,~,~,~,dog|~] 
yes

ハノイの塔のプログラム作成(未完成なので完成させてください)

10
?-remove.
hanoi(N) :- 
        hanoi(N,left,right,center).
hanoi(1,X,Y,Z) :- 
        move(1,X,Y).
hanoi(N,X,Y,Z) :- 
        作成してください.
move(N,X,Y) :- 
        write("move disc-"), 
        write(N), 
        write(" from "), 
        write(X), 
        write(" to "), 
        write(Y), 
        nl.
?- clear, listing.
?- hanoi(3).
09
hanoi(N) :- 
        hanoi(N,left,right,center).
hanoi(1,X,Y,Z) :- 
        move(1,X,Y).
hanoi(N,X,Y,Z) :- 
        作成してください.
move(N,X,Y) :- 
        write("move disc-"), 
        write(N), 
        write(" from "), 
        write(X), 
        write(" to "), 
        write(Y), 
        nl.
yes
?- hanoi(3).
move disc-1 from left to right
move disc-2 from left to center
move disc-1 from right to center
move disc-3 from left to right
move disc-1 from center to left
move disc-2 from center to right
move disc-1 from left to right
yes

for VisualWorks 7.6 with Jun780, Prologインタプリタのマニュアル(PDF)


Updated: 2015/11/08 (Created: 2008/06/02) KSU AokiHanko