Prolog试图使用cut或“!”

时间:2013-04-10 16:40:57

标签: prolog

我需要定义segment(X,Y)X作为Y中连续的一系列元素,我必须在我的解决方案中使用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] ;

2 个答案:

答案 0 :(得分:0)

您的segment谓词枚举原始列表的子序列,包括其中的“洞”。

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

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

我没有看到通过在某处添加剪切将一切打包到具有相同参数的一个谓词中的方法。这是因为seg_get中的选择必须仅在其当前两种可能性之间进行,如果我们将其重命名为segment,则它将能够回溯到其上方的其他可能性。

答案 1 :(得分:-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).

欢呼声..