确定地铁的最后一站

时间:2018-11-07 02:33:41

标签: prolog

像这样对地下管道的停靠点进行建模:

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中将话题包裹在否定词上...

1 个答案:

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