有没有办法只选择PROLOG中列表的第一个和最后一个元素?

朴素的圣人

我正在尝试编写一个谓词,如果X是Y的子列表,则该判断是正确的,而不考虑Y的第一项和最后一项。例如,查询listWithinList([b,c,d],[a, b,c,d,e])将返回True,但是查询listWithinList([b,c,d,e],[a,b,c,d,e])将产生False,因为e是Y的最后一个元素,不应该是X的一部分。

目前,我有,listWithinList(X,Y):-append(_,Y2,Y), append(X,_,Y2).但是我不确定如何更改代码,以使它起到相同的作用,但是没有考虑Y的第一项和最后一项。

伊莎贝尔·纽比(Isabelle Newbie)

当您向写入_参数时append,它指向任意列表。如此随意以至于其长度也是任意的。

例如:

?- append(_, Suffix, [a, b, c]).
Suffix = [a, b, c] ;
Suffix = [b, c] ;
Suffix = [c] ;
Suffix = [] ;
false.

在这里_可以代表任何名单中的[][a][a, b][a, b, c]但是我不需要告诉你这个。如果您给匿名变量改_一个专有名称,那么Prolog可以告诉您

?- append(Prefix, Suffix, [a, b, c]).
Prefix = [],
Suffix = [a, b, c] ;
Prefix = [a],
Suffix = [b, c] ;
Prefix = [a, b],
Suffix = [c] ;
Prefix = [a, b, c],
Suffix = [] ;
false.

相反,该术语[_]并不代表任意列表。它代表肯定有一个元素的列表。该元素(表示为_)是任意的。

例如:

?- append([_], Suffix, [a, b, c]).
Suffix = [b, c].

或者,再次使用适当的变量名,以便我们可以看到绑定:

?- append([X], Suffix, [a, b, c]).
X = a,
Suffix = [b, c].

这一切都是从问题的定义说的:

listWithinList(X,Y):-append(_,Y2,Y), append(X,_,Y2).

接近正确。但是,两种用法_不会“删除”每个元素。他们每个“删除”任意数量的元素因此,您不只是排在中间:

?- listWithinList(Middle, [a, b, c, d, e]).
Middle = [] ;
Middle = [a] ;
Middle = [a, b] ;
Middle = [a, b, c] ;
Middle = [a, b, c, d] ;
Middle = [a, b, c, d, e] ;
Middle = [] ;
Middle = [b] ;
Middle = [b, c] ;
Middle = [b, c, d] ;
Middle = [b, c, d, e] ;
Middle = [] ;
Middle = [c] ;
Middle = [c, d] ;
Middle = [c, d, e] ;
Middle = [] ;
Middle = [d] ;
Middle = [d, e] ;
Middle = [] ;
Middle = [e] ;
Middle = [] ;
false.

如果要从正面和背面“删除”仅一个元素的列表,则必须编写[_]

listWithinList(X, Y) :-
    append([_], Y2, Y),
    append(X, [_], Y2).

现在的行为如下:

?- listWithinList(Middle, [a, b, c, d, e]).
Middle = [b, c, d] ;
false.

此外,需要注意的区别[_][_|_]前者代表一个元素的列表后者代表一个或多个元素的列表在这种情况下,您不想“删除”多个元素,因此[_|_]像其他答案之一所示,使用绝对是胡说八道。

最后,Prolog可以建议我们进一步简化:

?- append([X], Xs, Ys).
Ys = [X|Xs].

追加一个元素列表[X]和任意列表Xs会给出一个列表,我们也可以[X | Xs]不使用编写该列表append因此,append不需要打个电话。我可以这样写这个谓词:

list_middle(List, Middle) :-
    append([_First | Middle], [_Last], List).

并像这样使用它:

?- list_middle([a, b, c, d, e], Middle).
Middle = [b, c, d] ;
false.

或像这样:

?- list_middle(List, [1, 2, 3]).
List = [_2658, 1, 2, 3, _2664].

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

有没有办法抓住一组的最后一个项目

有没有办法只查看表对象的最后一个实例

CSS选择器在所有框(第一个和最后一个)中添加一个before伪元素?

有没有办法显示数组中的下一个元素?

有没有办法知道在Genexus X v3上第一个和最后一个迭代中每个For的时间?

有没有办法放大“ setSelected”列表中的下一个节点?

在一个类的第一个/最后一个实例存在之前/之后调用一对函数。有没有更好的办法?

有没有办法在元组/列表中找到x的第一个值到对应的y?

有没有办法只输出此if语句的第一个元素Django模板?

有没有办法只终止命令序列中的第一个命令?

有没有一种方法可以选择或突出显示Altair中的最后一个或第一个“ n”个数据点?

有没有办法只切掉直方图的第一个空白,并取走Python中的所有剩余值?

有没有办法在飞镖流获得第一个结果时得到通知?

有没有办法避免在第一个和第二个选项卡上重复数据?PHP Codeigniter

有没有办法防止int值删除第一个0?

有没有办法在regexec调用后获得第一个不匹配字符的位置

有没有办法用KVC获取数组数组的所有第一个对象?

Python 有没有办法返回一个没有前 n 个元素的列表?

有没有办法使用迭代器跳过第一个值?

有没有办法在python中“堆叠”一个列表?

有没有办法让第二个函数使用第一个:syntax

单击 HTML 锚点时,有没有办法等待第一个字节?

有没有办法只使用 CSS 从容器中的特定项目到最后一个项目选择项目?

有没有办法选择包含一个包含文本“按钮”的类的页面中的所有元素?

有没有办法创建一个列表,其中包含由用户在 python 中输入添加的元素?

有没有办法用另一个替换列表中的索引?

如何删除列表的第一个和最后一个元素并返回没有这些元素的列表?

有没有办法在 protobuf 中将第一个枚举值设置为 1?

有没有办法在列表中获得相同的第一个或第二个元素元组?