gpt4 book ai didi

list - Prolog:检查某项是否是列表中的最后一项?

转载 作者:行者123 更新时间:2023-12-03 05:47:14 25 4
gpt4 key购买 nike

我是序言新手,基本上是在尝试编写一个子句,如果给定的项目是给定列表中的最后一项,则该子句的评估结果为 true。这是我所拥有的:

last(X,[Y|X]).
last(X,[Y|Z]) :- last(X,Z).

我认为这可以解决问题,但是当我询问序言时:

?- last(c,[a,b,c]).

Prolog 返回 false。我尝试了以下查询,看看 Prolog 认为什么应该符合我对最后的定义:

?- last(c,X).
X = [_G530|c] ;
X = [_G530, _G533|c] ;
X = [_G530, _G533, _G536|c]

所以,我不确定的是为什么“|”符号仍在列表中吗?

更新:last([c],[a,b,c]) 产生所需的行为。但是,我不确定为什么我的第一个参数必须是一个列表?

最佳答案

你可能想要这个:

 last(X,[X]).
last(X,[_|Z]) :- last(X,Z).

| 表示“尾部”或“列表的其余部分”。

使用 ?- last(c,X). Prolog 生成以 c 作为最后一项的列表(根据您的第一个定义)。

当您查询 ?- last(c,[a,b,c]). 时,它会返回 false,因为您尚未为仅包含一项的列表定义案例 [X][X|[]]。因此,当列表少于两个项目时,它会失败。

但是, last([c],[a,b,c]) 成功,因为您得到 [b|_29] 或任何表示尾部可能的内容可以是任何列表。所以'_29'可以是'[c]',满足第一个定义,如last([c],[b|[c]])。记住Prolog中的非空列表实际上是一个第一个列表项(头)和其余列表项(尾)的对。通常写为[头|尾]。

关于list - Prolog:检查某项是否是列表中的最后一项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21694499/

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