我正在尝试编写一个更长的函数(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/