2012-03-13 17 views
1

を知らない私は、私に与えられたリストのすべての可能なサブリストを返すプロローグを作りたいので、私は書いた:Prologのサブリストの生成、空のリストを掛ける - なぜ

:私はのような結果を得るそのようにし

subSet(L,S):- append(_,L2,L),append(S,_,L2). 

Out = [] ; 
Out = [a] ; 
Out = [a, b] ; 
Out = [a, b, c] ; 
Out = [] ; 
Out = [b] ; 
Out = [b, c] ; 
Out = [] ; 
Out = [c] ; 
Out = [] ; 

空のリストを繰り返すのをやめるにはどうすればよいですか?

答えて

2

ルールアウト。

list_subseq(_,[]). 
list_subseq(L, S) :- S = [_|_], .... 

しかし、サブシーケンスを表現することは、多くの場合、DCGでよく行われます。 this responseの最初の定義を参照してください。 append/3を使用すると動作する可能性がありますが、読みにくいコードにつながります。

2

すでに標準リスト述語の中にsublist述語があります([]を1回だけリストします)。私はあなたがこれをエクササイズとして実装していると仮定します...

空リストは常にサブリストなので、これは明示的に指定できます。あなたは、代わりにS[S|T]を使用して空のリストを避けることができます。

subSet(_, []). 
subSet(L, [S|T]) :- append(_, L2,L), append([S|T], _, L2). 

例の実行:あなたはすべての空のリストを記述し、一度手動で追加されていることを

| ?- subSet([a, b, c], Out). 

Out = [] ? ; 

Out = [a] ? ; 

Out = [a,b] ? ; 

Out = [a,b,c] ? ; 

Out = [b] ? ; 

Out = [b,c] ? ; 

Out = [c] ? ; 
+0

私は[S | T]の代わりにSの代わりに何をすればよいのですか?私はそれがここでは空リストではないことを知っていることを意味しますが、それを行うための他の方法はありますか? –

+0

違いは 'S 'は' [] 'に束縛でき、' [S | T] 'は束縛できないということです。もちろん、 'nonempty([_ | _])。 '述語を定義して' nonempty(S) 'を行うのは簡単です。' [S | T] 'を直接使うのが標準的な方法です。 – aioobe

+0

答えを 'sublist'述語btwへのリンクで更新しました。 – aioobe