检查元素后返回列表的Prolog谓词

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了检查元素后返回列表的Prolog谓词相关的知识,希望对你有一定的参考价值。

我是prolog的新手。我正在尝试编写一个接受元素和列表的谓词,并检查列表中元素的出现并返回元素后面的其余列表。 例子是mypredicate(3,[1,2,3,4,5,6,7])返回[3,4,5,6,7]。 我希望我能解释一下。

mypredicate(X, [X|_]).
mypredicate(X, [_|T]) :- mypredicate(X,T).

这基本上只是检查列表中是否有元素。如何编写一个在X后返回列表其余部分的规则?

答案

您需要返回基本情况中的所有列表,如:

mypredicate(X, [X|T],[X|T]).

该条款还包括:

 mypredicate(X, [_|T]) :- mypredicate(X,T).

当列表的头部是X时使用,所以你需要确保在这种情况下头部与X不同:

mypredicate(X, [H|T],L) :- dif(X,H),mypredicate(X,T).
另一答案

你应该添加第三个参数

mypredicate(X,[X|L],[X|L]).
mypredicate(X,[_|T],L) :- mypredicate(X,T,L).

如果您只对第一次出现的XL感兴趣,请在第一条规则中添加一个剪切:

mypredicate(X,[X|L],[X|L]) :- !.

另一种方法,使用库(列表)谓词:

@ tim.newport评论后修正

mypredicate(X,L,[X|T]) :- append(_,[X|T],L).

以上是关于检查元素后返回列表的Prolog谓词的主要内容,如果未能解决你的问题,请参考以下文章

Prolog - 如何返回每个元素只出现一次的列表?

Prolog使用在内部谓词之间的列表

同时应用谓词来过滤列表(SWI Prolog)

Prolog - 在将每个值加倍后,从原始列表中创建元素的新列表?

如何通过Prolog将字符串连接到列表中的多个元素?

Prolog 中的子列表谓词