请考虑以下事项:
link(step1, step2) .
link(step2, step3) .
link(step3, step4) .
goal(X) :- \+ link(X, _) .
我希望goal
仿函数代表一个不在链接开头的步骤。
但是当我尝试时:
| ?- goal(X).
no
(而不是告诉我step4是一个解决方案)
但是,以下内容确实评估为yes
:
goal(step4).
我猜这是因为我要求prolog找到无法找不到的东西(叹息 ...)
我能做到这一点吗?
答案 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, _).
但我相信离散事实清单更可取。