我写了一个谓词来查找子列表:
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。对于这个问题,没有让时间复杂度更大?
答案 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实现的内置谓词中。如果是这种情况,你不应该试着重新定义那些。