【发布时间】:2018-07-11 16:25:56
【问题描述】:
我写了以下谓词:
list_withoutlast([_Last], []). % forget the last element
list_withoutlast([First, Second|List], [First|WithoutLast]) :-
list_withoutlast([Second|List], WithoutLast).
像list_withoutlast(X, [1, 2]). 这样的查询会确定地成功,但是像list_withoutlast([1, 2, 3], X) 这样的查询会留下一个选择点,即使只有一个答案。
当我追踪时,似乎 SWI 尝试将 list_withoutlast([3], Var) 与这两个子句匹配,尽管肯定只有第一个匹配!
我还能做些什么来告诉 SWI 我想要一个包含多个元素的列表吗?或者,如果我想利用第一个参数索引,我唯一的选择是“零长度列表”和“非零长度列表”吗?
其他 Prolog 对这种情况的处理方式有什么不同吗?
【问题讨论】:
-
@Paulo 为什么要删除 SWI-Prolog 标签?
-
这个问题很笼统。因此,通过使用通用的
Prolog标签,我们告诉其他人相同的问题和解决方案适用于其他 Prolog 实现。
标签: indexing prolog termination