【发布时间】: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