-1

我需要在 中定义segment(X,Y),X作为连续的一系列元素Y,并且我必须在我的解决方案中使用 cut 。

我应该如何使用cut?如果我使用!,那么我将不会获得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谓词枚举原始列表的子序列,包括其中的“漏洞”。

为了只生成列表的连续段,从概念上讲有两个阶段——首先我们跳过列表,然后收集一些 it 元素。所以我们必须有两个独立的谓词:

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

我看不出有一种方法可以通过在某处添加一个剪切来将它们全部打包到一个具有相同参数的谓词中。那是因为 in 的选择seg_get必须只在它当前的两个可能性之间,如果我们只是将它重命名为segment,它将能够回溯到它上面的其他可能性。

于 2013-04-10T22:10:41.213 回答
-1

在某些情况下,您必须使用 cut 来获得结果,但没有它也有可能做到这一点。这是我的解决方案,希望对您有所帮助。

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 回答