找出Prolog中无法证明的东西

时间:2014-03-11 14:26:04

标签: prolog

请考虑以下事项:

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

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

我希望goal仿函数代表一个不在链接开头的步骤。

但是当我尝试时:

| ?- goal(X).

no

(而不是告诉我step4是一个解决方案)

但是,以下内容确实评估为yes

goal(step4).

我猜这是因为我要求prolog找到无法找不到的东西(叹息 ...)

我能做到这一点吗?

1 个答案:

答案 0 :(得分:2)

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

valid_step(X) :- link(X, _) ; link(_, X).

这将有助于您告诉goal有效步骤"以及#34;

goal(X) :- valid_step(X), \+ link(X, _).

产量:

| ?- goal(X).

X = step4

yes
| ?-

或者,如果更具体地说,您真的想要找到作为目标链接但不是源链接的X

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

这取决于你的事实是什么,它们意味着什么以及goal的语义是什么的大局。

也许更合适的方法来定义有效步骤,如果link关系不是逻辑上定义的有效步骤,那就是使valid_step成为一组事实,而不是我在上面显示的谓词:

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, _).

但我相信离散事实清单更可取。