像这样对地下管道的停靠点进行建模:
stop(line1, 1, a).
stop(line1, 2, b).
stop(line1, 3, d).
stop(line1, 4, e).
我正在尝试定义last(L, S)
,如果站点S
是行L
中的最后一个站点,则为true。因此last(line1, e)
是正确的,但last(line1, d)
不是。
我已经尝试过last(L, S) :- stop(L, N, S), \+stop(L, N+1, _).
,但它对线路上的每个停靠站都返回true,我不知道为什么。如果站点a是该行的最后一个停靠站,并且b)如果该行之后没有停靠站,则它是该行的最后停靠站。是吗?
我想这与否定部分有关-我仍然在Prolog中将话题包裹在否定词上...
答案 0 :(得分:1)
Prolog中的一个常见错误是Prolog不会不将语义附加到+
,-
等上。
如果您写:
?- X = 3 + 1.
X = 3+1.
它不会将其解释为计算结果的数学表达式,只是将其视为具有两个参数的函子。
当然Prolog 可以将此术语解释为数学表达式,如果正确实例化了变量,则可以计算结果。为此,我们使用is/2
[swi-doc]:
?= X is 3 + 1.
X = 4.
所以我们在这里可以评估N+1
并将其存储在变量中:
last(L, S) :-
stop(L, N, S),
N1 is N+1,
\+stop(L, N1, _).