在Prolog中获取给定列表的某些组合

时间:2016-03-29 21:25:03

标签: list prolog tail-recursion

我试图弄清楚如何使用尾递归来将给定列表与此模式分开。例如,list等于[1,2,3,4]。

clause([1,2,3,4],X). would return:
X = [1,2,3,4]
X = [1,2,3]
X = [2,3,4]
X = [1,2]
X = [2,3]
X = [3,4]
X = [1]
X = [2]
X = [3]
X = [4]

我很乐意就此提出任何建议。

2 个答案:

答案 0 :(得分:3)

您需要一个新名称,clause/2已被内置谓词占用。

list_sublist(Xs, Ys) :-
   Ys = [_|_],
   phrase(( ..., seq(Ys), ...), Xs).

... --> [] | [_], ... .

seq([]) --> [].
seq([E|Es]) --> [E], seq(Es).

| ?- list_sublist([1,2,3,4], Xs).
Xs = [1] ;
Xs = [1,2] ;
Xs = [1,2,3] ;
Xs = [1,2,3,4] ;
Xs = [2] ;
Xs = [2,3] ;
Xs = [2,3,4] ;
Xs = [3] ;
Xs = [3,4] ;
Xs = [4].

答案 1 :(得分:0)

SWISH sample显示如何获得构成更简单模式的功能:

suffix(Xs, Ys) :-
    append(_, Ys, Xs).

prefix(Xs, Ys) :-
    append(Ys, _, Xs).

sublist_not_empty(Xs, [Y|Ys]) :-
    suffix(Xs, Zs),
    prefix(Zs, [Y|Ys]).

我已经添加了“空”'条件,因为[Y | Ys]无法匹配空列表。