首页 > 解决方案 > 确定地下线路的最后一站

问题描述

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

stop(line1, 1, a).
stop(line1, 2, b).
stop(line1, 3, d).
stop(line1, 4, e).

如果车站是线路中的最后一个车站,我试图定义last(L, S)这是真的。这是真的,但不是。SLlast(line1, e)last(line1, d)

我已经尝试过last(L, S) :- stop(L, N, S), \+stop(L, N+1, _).,但是对于线路上的每个站点它都会返回 true,我不明白为什么。一个车站是一条线路的最后一站,如果它 a) 存在于该线路上,并且 b) 如果该线路在它之后没有站点。正确的?

我想这与否定部分有关 - 我仍然在Prolog中围绕否定......

标签: prolog

解决方案


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

推荐阅读