找到什么';在Prolog中是不可证明的

找到什么';在Prolog中是不可证明的,prolog,Prolog,考虑以下几点: link(step1, step2) . link(step2, step3) . link(step3, step4) . goal(X) :- \+ link(X, _) . 我希望goalfunctor表示不在链接开头的步骤 但当我尝试时: | ?- goal(X). no (而不是告诉我步骤4是一个解决方案) 但是,以下情况的计算结果为是: goal(step4). 我猜这是因为我要求prolog查找它找不到的内容(叹气…) 我可以这样做吗?问题在于Prolog

考虑以下几点:

link(step1, step2) .
link(step2, step3) .
link(step3, step4) .

goal(X) :- \+ link(X, _) .
我希望
goal
functor表示不在链接开头的步骤

但当我尝试时:

| ?- goal(X).

no
(而不是告诉我步骤4是一个解决方案)

但是,以下情况的计算结果为

goal(step4).
我猜这是因为我要求prolog查找它找不到的内容(叹气…)


我可以这样做吗?

问题在于Prolog不知道你的
X
有效值的范围是什么。在此特定示例中,您可以通过定义有效步骤来实现:

valid_step(X) :- link(X, _) ; link(_, X).
这将有助于您告诉“有效步骤的宇宙”的目标选择:

屈服:

| ?- goal(X).

X = step4

yes
| ?-
或者,如果更具体地说,您的真正意思是查找作为目标链接而不是源链接存在的
X

goal(X) :- link(_, X), \+ link(X, _).
这取决于你的事实是什么,它们的意思是什么,以及
goal
的语义到底是什么

如果
链接
关系不是有效步骤的逻辑定义,那么定义有效步骤的一种更合适的方法可能是将
有效步骤
作为一组事实,而不是我上面显示的谓词:

valid_step(step1).
valid_step(step2).
valid_step(step3).
valid_step(step4).
valid_step(step5).
这是一个简单的,完全独立的定义,定义了什么是有效的步骤,可以被其他需要这些信息的关系(谓词)使用

这样做可能很诱人:

valid_steps([step1,step2,step3,step4,step5]).
然后:

goal(X) :- valid_steps(Valid), member(X, Valid), \+ link(X, _).

但我认为,列出一些独立的事实更可取。

对。如果我想包括没有链接的步骤,我会选择
步骤(X):-X=step1;X=步骤2;X=步骤3;X=步骤4;X=step5.
?@Arlaudah,不,我会单独定义它们。我相应地更新了我的答案。
goal(X) :- valid_steps(Valid), member(X, Valid), \+ link(X, _).