【问题标题】:Prolog predicate makelistProlog谓词清单
【发布时间】: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 模块中定义,默认情况下,当找到对其谓词之一的调用时会自动加载。

标签: recursion prolog


【解决方案1】:

你可以简化你的代码,让我们来看看你的谓词,看看你真正需要做什么:

% makelist(X,Y,L)

由于您的递归调用将第一个参数增加 1,我们将其称为 X,那么您的基本情况将是 X 与 Y 相同时:

makelist(X,X,[X]) .

还有你的递归调用:当 X 小于 Y 时,你需要增加 X 并将值添加到列表中:

makelist(X,Y,[X|L]) :-  X < Y ,
            X1 is X + 1 ,
            makelist(X1, Y, L).

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多