【发布时间】:2014-05-07 12:50:44
【问题描述】:
定义一个 Prolog 谓词 makelist/3 使得 makelist(Start, End, List) 为真,如果
List 是从整数Start 到整数End 的所有整数的列表。例如:
makelist(3, 7, [3, 4, 5, 6, 7]) should be true.
不明白为什么我的代码不起作用
makelist(H, L, _) :-
L is H+1.
makelist(H, L, List) :-
append([], [H], List), H1 is H+1.
makelist(H1, L, List) :-
append(List, [H1], List1), last(List1, R),
R \= L+1, makelist(N, L, List1), N is H1+1.
【问题讨论】:
-
如果您查询
makelist(3, 4, [x,y,z]),您的第一个子句将立即成功,因为4 is 3+1会成功。[x,y,z]实际上可以是任何列表,它会成功。在您的第二个子句中,H1被评估为H + 1但从未使用过H1。您的第三个子句使用last/2。它在哪里以及如何定义? -
@lurker
last/2在 SWI-Prolog 中预定义。我也不知道 -
@Shevliaskovic 谢谢!我总是在寻找 GNU 中没有的新 SWI 谓词。 :)
-
@user3612140 - 想想简单的(基本)案例。它是什么样子的?我建议
H和L相同的情况。所以你的基本情况谓词可能是makelist(H, H, ?)(?会是什么样子?)。然后考虑如何从一般情况递归到基本情况。 -
last/2谓词是 SWI-Prolog 中的 library 谓词,而不是内置谓词。它在lists模块中定义,默认情况下,当找到对其谓词之一的调用时会自动加载。