Prolog列表长度比较返回true/false

标签 prolog

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

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)) 匹配应该为 true,其中 As = nil,最终匹配结束子句。

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

编辑:应该指出的是,此时我对 prolog 还很陌生。

更新 我对常见的序言语义有一些误解。包括尝试强制程序产生错误值(可能是受我对非声明性语言语义的理解的影响)。我已使用 @tiffi 的输入更新了我的答案。

最佳答案

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

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

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

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

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

关于Prolog列表长度比较返回true/false,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66607466/

相关文章:

prolog - Prolog 中的聊天机器人

prolog - SWI-Prolog 中的 catch/3 和 call_with_time_limit/2 谓词

database - 有没有办法在 Prolog 中创建索引数据集合?

list - 排序症状列表序言

lambda - 查找 Prolog 对列表中的键

prolog - 从事实中返回名称列表

prolog - SICStus Prolog 中的验证属性

Prolog、失败且不回溯

stream - 在Prolog中读取流时是否总是需要使用 '.\n'?

Prolog 初学者 : How to unify with arithmetic comparison operators or how to get a set var to range of values