【问题标题】:Prolog list length comparison return true/falseProlog 列表长度比较返回 true/false
【发布时间】:2021-03-12 21:31:16
【问题描述】:

我正在尝试编写一个更长的函数(S1,S2),如果 S1 比 S2 长,它应该为真,否则为假。到目前为止,我有以下内容:

longer(A,nil). 
longer(nil,B) :- false.
longer([A,AS],[B,BS]) :- longer(AS,BS).

但由于某种原因,当我提供例如输入时,我似乎无法正确解析它:longer([1,2],[1]). 但是当我通过 swi-prolog 运行上述内容时,它返回 false。

另一个例子是运行:longer([1],nil),它也返回 false,即使通过匹配 list(cons(A,As)) where As = nil 应该为 true,最后匹配 end 子句。

我错过了什么?有人可以在这里指出我正确的方向吗,因为我看不出这是如何评估为真的。

编辑:应该注意的是,我现在对 prolog 还很陌生。

更新我对常见的序言语义有一些误解。包括试图强制程序产生一个错误的值(可能是由我对非声明性语言语义的理解所引导的)。我已经用@tiffi 的输入更新了我的答案。

【问题讨论】:

  • 什么是零和缺点?
  • @tiffi nil 相当于 prolog 中的空列表 []。 cons 是一个序言运算符,而不是一个二元仿函数,例如:cons(1,cons(2,cons(3,nil))) 等价于1.2.3.nil[1,2,3]
  • ?- nil=[]。错误的。 ?- cons(1,cons(2,cons(3,nil)))=[1,2,3]。假的。
  • 这是我被简要教过的内容,并且还阅读了几处 - 所以这个假设是基于告诉我的内容。
  • @tiffi 我在网上找到的文档例如:irisa.fr/prive/ridoux/ICLP91/node7.html 等等。但是这些都没有很好的记录!因此,由于缺乏经验,我可能只是假设它们的正确性。这也是我第一次介绍声明式编程。

标签: prolog


【解决方案1】:

这是一个非常接近您提出的想法的解决方案:

longer([_|_],[]).
longer([_|As], [_|Bs]):- longer(As,Bs).

您对第一个子句(在您的编辑之前)的想法可以这样表达:

longer(A,[]):- is_list(A). %is_list/1 is inbuilt

但是,这不会给您正确的结果,因为空列表也是一个列表。因此,您需要确保第一个参数是一个非空列表。

【讨论】:

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