现在学 Prolog 合一和证明搜索 上机操作

转载自: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.

 

?- 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值