Prolog,关于如何形成更好的条款

时间:2017-11-23 11:03:10

标签: prolog prolog-dif prolog-cut logical-purity

我有以下条款:

res.json({message: "Success! You can not see this without a token"});

当我输入查询时:

num_parent(adam, X) :- !, X = 0.  
num_parent(eve, X) :- !, X = 0.  
num_parent(X, 2).  

它只返回:

num_parent(eve,X).

这就是我想要的。

但是当我输入这个查询时:

X = 0.  

它只返回:

num_parent(X,0).  

那么如何修改子句以使其返回:

X = adam.

由于

2 个答案:

答案 0 :(得分:4)

首先,尝试用简单的英语表达你想要的东西。你可能想说:

  

每个人都有两个父母,除了亚当和夏娃,他们都没有。

莉莉丝怎么样?没关系,让我们坚持你的阅读。

num_parent(Person, 2) :-
   dif(Person, adam),
   dif(Person, eve).
num_parent(adam, 0).
num_parent(eve, 0).

正如你所看到的,定义这个有点麻烦:你必须两次提到每个特殊的人。容易出错。

library(reif)中提供if_/3 对于 SICStusSWI 你可以写得更简洁:

num_parent(Person, Num) :-
   if_( ( Person = adam ; Person = eve ), Num = 0, Num = 2 ).

现在有些用途:

?- num_parent(eve, Num).
   Num = 0.

?- num_parent(X, 0).
   X = adam
;  X = eve
;  false.

?- num_parent(X, 2).
   dif(X, eve),
   dif(X, adam).

?- num_parent(lilith, 2).
   true.

答案 1 :(得分:0)

程序仅返回X = adam,因为您插入了剪切!。如果您找到了正确的规则并且不需要进行进一步的评估,则会使用剪切,但它会削减所有其他解决方案。

在你的情况下

num_parent(adam, X) :- !, X = 0.  
num_parent(eve, X) :- !, X = 0.  
num_parent(_, 2). %replaced num_parent(X, 2) with num_parent(_, 2) to avoid singleton variable

num_parent(X, 0)仅返回X = adam

如果你写

num_parent(adam, X) :- X = 0.  
num_parent(eve, X) :- !, X = 0.  
num_parent(_, 2). 

解决方案将是X = adamX = eve,在这种情况下:

num_parent(adam, X) :- X = 0.  
num_parent(eve, X) :- X = 0.  
num_parent(_, 2). 

解决方案将是X = adamX = evefalse,因为查询num_parent(X, 0)未与num_parent(_, 2)统一。

您可以使用跟踪器更好地查看此行为。