Prolog 查找所有子列表

Prolog 查找所有子列表,prolog,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。在不增加时间复杂性的情况下回答这个问题?2015-05-13:完全重写 这里有点不清楚您在追求什么:您的谓词被称为子列表

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

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。在不增加时间复杂性的情况下回答这个问题?

2015-05-13:完全重写

这里有点不清楚您在追求什么:您的谓词被称为
子列表
,但从您的示例查询判断,您似乎在追求一个子集

无论如何,以下是这两个谓词的定义:

子列表(?L1,+L2)
(顺序和重复项很重要)

sublist([], L).
sublist([X|Xs], [X|Ys]) :- sublist(Xs, Ys).
sublist(Xs, [_|Ys]) :- sublist(Xs, Ys).
subset([], L).
subset([X|Xs], L) :- member(X, L), subset(Xs, L).
子集(?L1,+L2)
(顺序和副本无关紧要)

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

请注意,这些谓词可能作为prolog实现的内置谓词存在。如果是这种情况,您不应该尝试重新定义这些内容。

2015-05-13:完全重写

这里有点不清楚您在追求什么:您的谓词被称为
子列表
,但从您的示例查询判断,您似乎在追求一个子集

无论如何,以下是这两个谓词的定义:

子列表(?L1,+L2)
(顺序和重复项很重要)

sublist([], L).
sublist([X|Xs], [X|Ys]) :- sublist(Xs, Ys).
sublist(Xs, [_|Ys]) :- sublist(Xs, Ys).
subset([], L).
subset([X|Xs], L) :- member(X, L), subset(Xs, L).
子集(?L1,+L2)
(顺序和副本无关紧要)

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

请注意,这些谓词可能作为prolog实现的内置谓词存在。如果是这种情况,你不应该尝试重新定义它们。

你甚至是指子集,我猜,因为你不保留顺序。你甚至是指子集,我猜,因为你不保留顺序,你的代码也会返回
true
,对于
?-子集([1,2],[1,1])。
,这可能是不正确的。是的,你必须选择
select/3
而不是
member/2
@whd,对吗。我不确定你是否使用Prolog实现了一个内置的排序谓词。@ AIOOBE:考虑编辑你的帖子来删除/修改你的子集谓词,它不是子集谓词ATM。@ MOG,请帮我反例。(我今天有点慢…)对于
?-子集([1,2],[1,1]),您的代码也会返回
true
,这可能是不正确的。是的,您必须使用
选择/3
而不是
成员/2
@whd,对吗。我不确定你是否使用Prolog实现了一个内置的排序谓词。@ AIOOBE:考虑编辑你的帖子来删除/修改你的子集谓词,它不是子集谓词ATM。@ MOG,请帮我反例。(我今天有点慢…)