【发布时间】:2015-06-01 19:40:05
【问题描述】:
我正在编写 Prolog 中非常简单的反向列表示例。
append(A, [], [A]).
append(A, B, [A|B]).
reverse([], ReversedList).
reverse([A,B], ReversedList) :-
reverse(B, TemporaryList),
append(A, TemporaryList, ReversedList).
append 工作正常。但是,当我调用 reverse 时,解释器不会响应 append 之类的变量,而是只写 true 或 false。
这是日志:
1 ?- consult('capitolo2'.pl). % file containing the code
2 ?- append(a, [b,c,d], L).
L = [a,b,c,d]. % ok, this works
3 ?- reverse([a,b,c], L).
false. % what? why that's not L = something?
平台是 Windows 上的 SWI-Prolog 7.2
【问题讨论】:
-
这是
append的一个相当不标准的定义,通常append被定义为在列表上工作,例如append([a,b,c], [x,y,z], L) ==> L = [a,b,c,x,y,z], stackoverflow.com/questions/11539203/… -
看来这不是问题。如果我将
append重命名为my_append是一样的 -
你也需要重启 Prolog 系统。此外还有
[A,B],它可能应该读作[A|B]等等...... -
只有当第一个参数是空列表 (
[]) 或两个元素列表 ([A, B]) 时,您的reverse规则才会成功。它将失败所有其他情况,因为它们不匹配。 -
你为什么要实现像
append/3这样的标准谓词?如果你有充分的理由去做,为什么一旦遇到问题你不去查一下?
标签: prolog