我有以下条款:
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.
由于
答案 0 :(得分:4)
首先,尝试用简单的英语表达你想要的东西。你可能想说:
每个人都有两个父母,除了亚当和夏娃,他们都没有。
莉莉丝怎么样?没关系,让我们坚持你的阅读。
num_parent(Person, 2) :-
dif(Person, adam),
dif(Person, eve).
num_parent(adam, 0).
num_parent(eve, 0).
正如你所看到的,定义这个有点麻烦:你必须两次提到每个特殊的人。容易出错。
library(reif)
中提供if_/3
对于
SICStus和
SWI
你可以写得更简洁:
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 = adam
和X = eve
,在这种情况下:
num_parent(adam, X) :- X = 0.
num_parent(eve, X) :- X = 0.
num_parent(_, 2).
解决方案将是X = adam
,X = eve
和false
,因为查询num_parent(X, 0)
未与num_parent(_, 2)
统一。
您可以使用跟踪器更好地查看此行为。