确定列表是否是prolog中另一个列表的子列表

时间:2014-10-22 00:18:56

标签: prolog

我刚写了一个谓词来确定列表是否是另一个列表的子列表。

sublist( [], _ ).
sublist( [X|XS], [X|XSS] ) :- sublist( XS, XSS ).
sublist( [X|XS], [_|XSS] ) :- sublist( [X|XS], XSS ).

但是这个谓词只能处理这样的情况。

1 ?- sublist([1,2,3], [0,1,0,2,0,3,0]).
true .

它是否也可以处理其序列与其他列表不同的列表?

2 ?- sublist([['D','A','G'],['V','E','D']], [['V','E','D'],['D','A','G']]).
false.

任何帮助将不胜感激~~

1 个答案:

答案 0 :(得分:2)

我想你的问题是你正在寻找子集而不是子列表。 如果第一个列表中的每个项目都具有多重性,并且您希望它成功,则可以编写:

subset([], _).
subset([X|Tail], Y):-
  memberchk(X, Y),
  subset(Tail, Y).

第一个子句是基本情况,第二个子句检查项是否在Y中,并从第一个列表和第二个列表中按尾部进行递归递归。

如果第一个列表中的每个项目都消耗了"从第二个列表中的项目,然后你会写:

subset([], _).
subset([X|Tail], Y):-
  select(X, Y, Z),
  subset(Tail, Z).

在这种情况下,第二个子句使用select/3,以便在递归时从第二个列表中删除匹配元素。