我刚写了一个谓词来确定列表是否是另一个列表的子列表。
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.
任何帮助将不胜感激~~
答案 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
,以便在递归时从第二个列表中删除匹配元素。