转载自:https://mp.weixin.qq.com/s/jRsgECeGagR-EOGIlLJUwQ
$ swipl
Welcome to SWI-Prolog (threaded, 64 bits, version 8.1.15)
SWI-Prolog comes with ABSOLUTELY NO WARRANTY. This is free software.
Please run ?- license. for legal details.
For online help and background, visit https://www.swi-prolog.org
For built-in help, use ?- help(Topic). or ?- apropos(Word).
?- =(mia,mia).
true.
?- =(mia,vincent).
false.
?- mia=mia.
true.
?- 2=2.
true.
?- 'mia'=mia.
true.
?- '2'=2.
false.
?- mia=X.
X = mia.
?- X=Y.
X = Y.
?- X=_5071.
X = _5071.
?- Y=_5071.
Y = _5071.
?- X=mia, X=vincent.
false.
?- k(s(g),Y)=k(X,t(k)).
Y = t(k),
X = s(g).
?- k(s(g),t(k)) = k(X,t(Y)).
X = s(g),
Y = k.
?- loves(X,X) = loves(marcellus,mia).
false.
?- X = father(X).
X = father(X).
?- X = father(X), Y = father(Y), X = Y.
X = Y, Y = father(Y).
?- unify_with_occurs_check(father(X), X).
false.
?- [user].
|: vertical(line(point(X,Y), point(X,Z))).
Warning: user://1:81:
Warning: Singleton variables: [Y,Z]
|: horizontal(line(point(X,Y),point(Z,Y))).
Warning: user://1:85:
Warning: Singleton variables: [X,Z]
|: ^D% user://1 compiled 0.00 sec, 2 clauses
true.
?- vertical(line(point(1,1),point(1,3))).
true.
?- vertical(line(point(1,1),point(3,2))).
false.
?- horizontal(line(point(1,1), point(2,Y))).
Y = 1.
?- horizontal(line(point(2,3),P)).
P = point(_9514, 3).
教材中的描述与新版的结果有差异请看如下是新版本的结果:
?- [user].
|: f(a).
|: f(b).
|:
|: g(a).
|: g(b).
|:
|: h(b).
|:
|: k(X):-f(X),g(X),h(X).
|: ^D% user://1 compiled 0.00 sec, 6 clauses
true.
?- k(Y).
Y = b.
我们在这里再增加一些事实再看看结果
?- halt. //为了避免其它干扰请按步骤完成操作。
LIMANdeMacBook-Pro:swi-prolog limanxi$ swipl
Welcome to SWI-Prolog (threaded, 64 bits, version 8.1.15)
SWI-Prolog comes with ABSOLUTELY NO WARRANTY. This is free software.
Please run ?- license. for legal details.
For online help and background, visit https://www.swi-prolog.org
For built-in help, use ?- help(Topic). or ?- apropos(Word).
?- [user].
|: f(a).
|: f(b).
|: f(c).
|:
|: g(a).
|: g(b).
|: g(c).
|:
|: h(b).
|: h(c).
|: k(X):-f(X),g(X),h(X).
|: ^D% user://1 compiled 0.01 sec, 9 clauses
true.
?- k(Y).
Y = b ; //这里“;”是录入的符号
Y = c.
?-
结论是:当有多个解时新系统才会给用户输入“;”或“.”的时机。
?- [user].
|: loves(vincent,mia).
|: loves(marcellus,mia).
|:
|: jealous(A,B):-loves(A,C),loves(B,C).
|: ^D% user://1 compiled 0.00 sec, 3 clauses
true.
?- jealous(X,Y).
X = Y, Y = vincent ;
X = vincent,
Y = marcellus ;
X = marcellus,
Y = vincent ;
X = Y, Y = marcellus.
?-
//练习2.3
?- [user].
|: word(determiner,a).
|: word(determiner,every).
|: word(noun,criminal).
|: word(noun,'big kahuna burger').
|: word(verb,eats).
|: word(verb,likes).
|: sentence(Word1,Word2,Word3,Word4,Word5):-
|: word(determiner,Word1),
|: word(noun,Word2),
|: word(verb,Word3),
|: word(determiner,Word4),
|: word(noun,Word5).
|: ^D% user://1 compiled 0.01 sec, 7 clauses
true.
?- sentence(W1,W2,W3,W4,W5).
W1 = W4, W4 = a,
W2 = W5, W5 = criminal,
W3 = eats ;
W1 = W4, W4 = a,
W2 = criminal,
W3 = eats,
W5 = 'big kahuna burger' ;
W1 = a,
W2 = W5, W5 = criminal,
W3 = eats,
W4 = every ;
W1 = a,
W2 = criminal,
W3 = eats,
W4 = every,
W5 = 'big kahuna burger' ;
W1 = W4, W4 = a,
W2 = W5, W5 = criminal,
W3 = likes ;
W1 = W4, W4 = a,
W2 = criminal,
W3 = likes,
W5 = 'big kahuna burger' ;
W1 = a,
W2 = W5, W5 = criminal,
W3 = likes,
W4 = every ;
W1 = a,
W2 = criminal,
W3 = likes,
W4 = every,
W5 = 'big kahuna burger' ;
W1 = W4, W4 = a,
W2 = 'big kahuna burger',
W3 = eats,
W5 = criminal ;
W1 = W4, W4 = a,
W2 = W5, W5 = 'big kahuna burger',
W3 = eats ;
W1 = a,
W2 = 'big kahuna burger',
W3 = eats,
W4 = every,
W5 = criminal ;
W1 = a,
W2 = W5, W5 = 'big kahuna burger',
W3 = eats,
W4 = every ;
W1 = W4, W4 = a,
W2 = 'big kahuna burger',
W3 = likes,
W5 = criminal ;
W1 = W4, W4 = a,
W2 = W5, W5 = 'big kahuna burger',
W3 = likes ;
W1 = a,
W2 = 'big kahuna burger',
W3 = likes,
W4 = every,
W5 = criminal ;
W1 = a,
W2 = W5, W5 = 'big kahuna burger',
W3 = likes,
W4 = every ;
W1 = every,
W2 = W5, W5 = criminal,
W3 = eats,
W4 = a ;
W1 = every,
W2 = criminal,
W3 = eats,
W4 = a,
W5 = 'big kahuna burger' ;
W1 = W4, W4 = every,
W2 = W5, W5 = criminal,
W3 = eats ;
W1 = W4, W4 = every,
W2 = criminal,
W3 = eats,
W5 = 'big kahuna burger' ;
W1 = every,
W2 = W5, W5 = criminal,
W3 = likes,
W4 = a ;
W1 = every,
W2 = criminal,
W3 = likes,
W4 = a,
W5 = 'big kahuna burger' ;
W1 = W4, W4 = every,
W2 = W5, W5 = criminal,
W3 = likes ;
W1 = W4, W4 = every,
W2 = criminal,
W3 = likes,
W5 = 'big kahuna burger' ;
W1 = every,
W2 = 'big kahuna burger',
W3 = eats,
W4 = a,
W5 = criminal ;
W1 = every,
W2 = W5, W5 = 'big kahuna burger',
W3 = eats,
W4 = a ;
W1 = W4, W4 = every,
W2 = 'big kahuna burger',
W3 = eats,
W5 = criminal ;
W1 = W4, W4 = every,
W2 = W5, W5 = 'big kahuna burger',
W3 = eats ;
W1 = every,
W2 = 'big kahuna burger',
W3 = likes,
W4 = a,
W5 = criminal ;
W1 = every,
W2 = W5, W5 = 'big kahuna burger',
W3 = likes,
W4 = a ;
W1 = W4, W4 = every,
W2 = 'big kahuna burger',
W3 = likes,
W5 = criminal ;
W1 = W4, W4 = every,
W2 = W5, W5 = 'big kahuna burger',
W3 = likes.
?-
//练习2.4
?- [user].
|: word(astante, a,s,t,a,n,t,e).
|: word(astoria, a,s,t,o,r,i,a).
|: word(baratto, b,a,r,a,t,t,o).
|: word(cobalto, c,o,b,a,l,t,o).
|: word(pistola, p,i,s,t,o,l,a).
|: word(statale, s,t,a,t,a,l,e).
|:
|: crossword(V1,V2,V3,H1,H2,H3):-
|: word(V1,_,A,_,B,_,C,_),
|: word(V2,_,D,_,E,_,F,_),
|: word(V3,_,G,_,H,_,I,_),
|: word(H1,_,A,_,D,_,G,_),
|: word(H2,_,B,_,E,_,H,_),
|: word(H3,_,C,_,F,_,I,_).
|: ^D% user://2 compiled 0.00 sec, 7 clauses
true.
?- crossword(V1,V2,V3,H1,H2,H3).
V1 = H1, H1 = astante,
V2 = H2, H2 = baratto,
V3 = H3, H3 = statale ;
V1 = astante,
V2 = cobalto,
V3 = pistola,
H1 = astoria,
H2 = baratto,
H3 = statale ;
V1 = astoria,
V2 = baratto,
V3 = statale,
H1 = astante,
H2 = cobalto,
H3 = pistola ;
V1 = H1, H1 = astoria,
V2 = H2, H2 = cobalto,
V3 = H3, H3 = pistola ;
V1 = V2, V2 = H1, H1 = H2, H2 = baratto,
V3 = H3, H3 = statale ;
V1 = H1, H1 = cobalto,
V2 = H2, H2 = baratto,
V3 = H3, H3 = statale ;
false.
实践环节
?- food(bread,X) = food(Y,sausage).
X = sausage,
Y = bread.
?- g(X,Y) = Y.
Y = g(X, Y).
?- X = f(X), Y = f(Y), X = Y.
X = Y, Y = f(Y).
?- a \= b.
true.
$ vim proof.pl
to SWI-Prolog (threaded, 64 bits, version 8.1.15)
SWI-Prolog comes with ABSOLUTELY NO WARRANTY. This is free software.
Please run ?- license. for legal details.
For online help and background, visit https://www.swi-prolog.org
For built-in help, use ?- help(Topic). or ?- apropos(Word).
?- [proof].
true.
?- trace.
true.
[trace] ?- k(X).
Call: (10) k(_6092) ? creep
Call: (11) f(_6092) ? creep
Exit: (11) f(a) ? creep
Call: (11) g(a) ? creep
Exit: (11) g(a) ? creep
Call: (11) h(a) ? creep
Fail: (11) h(a) ? creep
Redo: (11) f(_6092) ? creep
Exit: (11) f(b) ? creep
Call: (11) g(b) ? creep
Exit: (11) g(b) ? creep
Call: (11) h(b) ? creep
Exit: (11) h(b) ? creep
Exit: (10) k(b) ? creep
X = b.
[trace] ?- notrace.
true.
[debug] ?- nodebug.
true.
?-