-1

の連続した一連の要素としてsegment(X,Y)を定義する必要があり、ソリューションでカットを使用する必要があります。XY

カットの使い方は?を使用すると、最初のヘッダーの後に!取得できません。trueこれは私が持っているものです:

segment([],_).
segment([H|T],[H|Y]) :- segment(T,Y).
segment([H|T],[X|Y]) :- segment([H|T],Y).

これは私の出力です

34 ?- segment(X,[1,2,3,4]).
X = [] 
Action? ;
X = [1] ;
X = [1, 2] ;
X = [1, 2, 3] ;
X = [1, 2, 3, 4] ;
X = [1, 2, 4] ;
X = [1, 3] ;
X = [1, 3, 4] ;
X = [1, 4] ;
X = [2] ;
X = [2, 3] ;
X = [2, 3, 4] ;
X = [2, 4] ;
X = [3] ;
X = [3, 4] ;
X = [4] ;
4

2 に答える 2

0

あなたのsegment述語は、元のリストのサブシーケンスを列挙し、それらの「穴」を含みます。

リストの連続するセグメントのみを生成するには、概念的に 2 つの段階があります。最初にリストをスキップし、次にその要素の一部を収集します。したがって、そのためには 2 つの別個の述語が必要です。

segment([],[]).
segment(X,[_|L]):- segment(...).        % we either skip,
segment(X,L):- seg_get(X,L).            % or get some elements

seg_get([A|B],[A|D]):- seg_get(...).    % we get some elements
seg_get([A],[A|_]).                     % or we stop whenever we feel like it

どこかにカットを追加して、同じ引数を持つ 1 つの述語にすべてをパッケージ化する方法がわかりません。これは、 の選択はseg_get現在の 2 つの可能性の間でのみ行う必要があり、名前を に変更するとsegment、それより上の他の可能性に戻ることができるためです。

于 2013-04-10T22:10:41.213 に答える
-1

場合によっては、結果を得るためにカットを使用する必要がありますが、それなしでこれを行う可能性があります。これが私の解決策です。

segment([],_). 
segment([H|T],[H|Y]) :- segmenthelperino(T,Y), !.
segment([H|T],[_|Y]) :- segment([H|T],Y).
// This is the helper function
segmenthelperino([],_). 
segmenthelperino([H|T],[H|Y]) :- segmenthelperino(T,Y).

乾杯..

于 2014-04-05T13:38:48.527 に答える