查找所有子列表

时间:2012-03-27 09:28:51

标签: prolog

我写了一个谓词来查找子列表:

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

但这不正确,因为它会失败:

sublist([1,2,20,4,5,6],[1,2,4,20]).

如何更改此谓词以回答true。对于这个问题,没有让时间复杂度更大?

1 个答案:

答案 0 :(得分:0)

2015-05-13:完成重写

有点不清楚你在此之后的内容:你的谓词被称为sublist,但从你的示例查询来看,似乎你是在subset之后

无论如何,这里有两个谓词的定义:

sublist(?L1, +L2)(订单和重复事项)

sublist([], L).
sublist([X|Xs], [X|Ys]) :- sublist(Xs, Ys).
sublist(Xs, [_|Ys]) :- sublist(Xs, Ys).

subset(?L1, +L2)(订单和重复无关紧要)

subset([], L).
subset([X|Xs], L) :- member(X, L), subset(Xs, L).

请注意,这些谓词可能存在于prolog实现的内置谓词中。如果是这种情况,你不应该试着重新定义那些。