Prolog - 第一个列表是第二个列表的子列表?

时间:2011-08-13 15:31:31

标签: prolog

例如:

isin([1,2,3], [1,0,1,2,3,0])

将生成true,因为123位于101230

我写了以下代码:

isin([AH|AT],[AH|AT]).

isin([AH|AT],[BH|BT]):- AH = BH, isin(AT,BT),isin([AH|AT],BT).

似乎不起作用。不要使用任何内置函数和BTW,Prolog有一个内置的sublist(L1,L2)函数。

如何使用SWI-Prolog针对内置函数编写查询?我试着直接写

?- sublist([1],[2]).

但它给我underfined procedure错误。

是否可以看到内置函数是如何编码的?怎么样?

5 个答案:

答案 0 :(得分:8)

sublist( [], _ ).
sublist( [X|XS], [X|XSS] ) :- sublist( XS, XSS ).
sublist( [X|XS], [_|XSS] ) :- sublist( [X|XS], XSS ).

答案 1 :(得分:1)

如果你想要

my_sublist( [2,3,4], [1,2,3,4,5] ) 

......成功,但

my_sublist( [1,3,5], [1,2,3,4,5] ) 

...失败,你可能想要考虑

my_sublist( Sublist, List ) :-
    append( [_, Sublist, _], List ).

请注意,如果您通过子列表传递变量,则回溯将为您提供List的所有可能子列表的全面集合,但这通常包括空列表的几个重复(因为空列表可以与所有其他列表组合在附加操作中将它们前后都列入子列表。)

答案 2 :(得分:0)

由于它似乎是作业,我只会给你一些提示:

  • 您似乎错过了空列表是另一个列表的子列表的情况。

  • 您将两个案例“子列表从这里开始”和“子列表稍后开始”混合成一个子句。

  • 子列表中的元素似乎应该在较大的列表中是连续的。为此你需要两个谓词。基本上你必须记住,当你拆开列表时,子列表已经开始了。

没有内置sublist/2,只有sublist/3执行不同的操作(使用谓词过滤列表)。

答案 3 :(得分:0)

另一个使用成员的实现是:

sublist([],_).
sublist([X|Xs],Y) :- member(X,Y) , sublist(Xs,Y).

member / 2如果在列表中找到元素,则返回true

member(X,[X|_]).
member(X,[_|Ys]):-member(X,Ys).

答案 4 :(得分:0)

export const addArticle = createAction(ADD_ARTICLE, ????)

为了避免失败情况下的堆栈溢出,我们必须确定列表 sublist(S, L) :-length(S, N), length(L, N1), N2 is N1 - N, length(P, N2), append( _ , S, P), append(P, _ , L). 的大小。