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

确定一个列表是否是prolog中另一个列表的子列表,prolog,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 ?- sublis

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

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.

任何帮助都将不胜感激~~~

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

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
,以便在递归时从第二个列表中删除匹配元素