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

标签 list prolog dcg

我是序言新手,基本上是在尝试编写一个子句,如果给定的项目是给定列表中的最后一项,则该子句的评估结果为 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/

相关文章:

prolog - 使用累积量

prolog - 是什么让 DCG 谓词变得昂贵?

prolog - DCG 惯用短语偏好

prolog - 解析屈折的非词序语言(例如拉丁语)

c# - 在列表中使用数组-OOP-通用列表

list - 任何CouchDB _list函数都无法工作

基本示例中的 Prolog Existence_Error 过程

java - 如何将 JavaRDD<Row> 转换为 JavaRDD<List<String>>?

javascript - 尝试获取 href 的 attr 时获取#[object Object]

prolog - Prolog 中 bagof/3 的问题