2016-03-29 28 views
1

私はテール再帰を使用してこのパターンで指定されたリストを分割する方法を理解しようとしています。たとえば、listは[1,2,3,4]と等しくなります。Prologで指定されたリストのいくつかの組み合わせを取得する

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] 

私はそれ上の任意のアドバイスを与えるために感謝されます。

答えて

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]. 
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 |イース]をので、私は、「空でない」条件を追加した空と一致することはできませんリスト。

関連する問題