1

指定されたリストの可能なすべてのサブリストを返すプロローグを作成したいので、次のように書きました。

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 = [] ;

空のリストの繰り返しを取り除くために何をしなければなりませんか?

4

2 に答える 2

2

sublist標準のリスト述語の中にはすでに述語があることに注意してください(これは[]1 回だけリストされます)。これを演習として実装していると仮定します...


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

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] ? ;
于 2012-03-13T17:05:19.833 に答える
2

空のリストをまったく記述していないことを除外し、一度手動で追加してください。

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

それにもかかわらず、サブシーケンスの表現は、多くの場合、DCG を使用した方が適切です。この回答の最初の定義を参照してください 。を使用append/3するとうまくいくかもしれませんが、非常に読みにくいコードになります。

于 2012-03-13T17:07:44.357 に答える