2016-03-29 7 views
1

Ich versuche herauszufinden, wie Tail-Rekursion verwendet wird, um gegebene Liste mit diesem Muster zu teilen. Zum Beispiel ist die Liste gleich [1,2,3,4].Einige Kombinationen der gegebenen Liste in Prolog erhalten

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] 

Ich wäre dankbar für jeden Hinweis darauf geben.

Antwort

3

Sie benötigen einen neuen Namen, clause/2 ist bereits von einem integrierten Prädikat übernommen.

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

Es gibt eine SWISH sample ist, die zeigt, wie die Funktionalität erhalten einfachere Muster Komponieren:

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]). 

ich die ‚nicht leer‘ Bedingung hinzugefügt haben, da [Y | Ys] können kein leeres entsprechen Liste.

Verwandte Themen