Prolog

2016-03-29 45 views
1

'da verilen listenin bazı kombinasyonlarını alma Verilen listeyi bu kalıpla bölmek için kuyruk özleminin nasıl kullanılacağını anlamaya çalışıyorum. Örneğin, liste [1,2,3,4] 'e eşittir.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] 

Bu konuda herhangi bir tavsiye verdiğiniz için minnettar olurum.

cevap

3

Yeni bir ada sahip olmanız gerekiyor, clause/2 zaten yerleşik bir yüklem tarafından çekiliyor.

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

basit desenleri oluşturan işlevselliği edinme gösterir bir SWISH sample vardır: O zamandan beri, 'boş değil' koşulunu ekledik

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] boş maç olamaz liste.