gpt4 book ai didi

Prolog 列表长度比较返回真/假

转载 作者:行者123 更新时间:2023-12-04 07:57:57 26 4
gpt4 key购买 nike

我正在尝试编写一个函数 long(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)) 其中As = nil 为true,最终匹配end 子句。
我错过了什么?有人可以在这里指出我正确的方向,因为我看不出这是如何评估为真的。
编辑:应该注意的是,此时我对 prolog 还很陌生。
更新 我对什么是常见的序言语义有一些误解。包括试图强制程序产生一个错误值(可能是我对非声明性语言语义的理解所引导的)。我已经用@tiffi 的输入更新了我的答案。

最佳答案

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

longer([_|_],[]).
longer([_|As], [_|Bs]):- longer(As,Bs).
您对第一个子句(在编辑之前)的想法可以这样表达:
longer(A,[]):- is_list(A). %is_list/1 is inbuilt
但是,这不会给您正确的结果,因为空列表也是一个列表。因此,您需要确保第一个参数是一个非空列表。

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com