prolog - 确定地下线路的最后一站
问题描述
像这样对地下管线的停靠点进行建模:
stop(line1, 1, a).
stop(line1, 2, b).
stop(line1, 3, d).
stop(line1, 4, e).
如果车站是线路中的最后一个车站,我试图定义last(L, S)
这是真的。这是真的,但不是。S
L
last(line1, e)
last(line1, d)
我已经尝试过last(L, S) :- stop(L, N, S), \+stop(L, N+1, _).
,但是对于线路上的每个站点它都会返回 true,我不明白为什么。一个车站是一条线路的最后一站,如果它 a) 存在于该线路上,并且 b) 如果该线路在它之后没有站点。正确的?
我想这与否定部分有关 - 我仍然在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, _).
推荐阅读
- regex - 负前瞻电路 (REGEX) 的问题 - 查找错误的格式化字符串
- vhdl - STD_LOGIC_VECTOR 切片并再次使用 case 语句构建问题?
- php - 对象数组上的array_diff
- spring - 在服务器位置创建日志文件的相关问题
- javascript - 我如何在 ajax 调用和事件处理程序中进行 DOM 操作
- ios - WebRTC iOS 本地视频轨道未在 RTCEAGLVideoView 上呈现
- reactjs - 尝试将对象推入数组时使用 onSubmit 的更好方法
- python - Chatterbot 未设置数据库名称
- django-rest-framework - Django Rest Framework - 哪些视图用于简单聚合?
- css - 将分页与底部中心对齐