Syntax Prolog返回结果

Syntax Prolog返回结果,syntax,prolog,prolog-dif,Syntax,Prolog,Prolog Dif,对于家庭作业,没有明确说明,请: 有没有办法让Prolog只返回程序找到的第一个目标,而忽略找到的其他目标 为了便于说明,给定程序: permutation([X|Xs],Zs):-permutation(Xs,Ys), insert(X,Ys,Zs). permutation([],[]). 有没有办法使程序只返回第一个置换作为其唯一的解决方案?在下列情况下: | ?- permutation([1,2,3],X). X = [1,2,3] ? ; X = [1,3,2] ? ; X

对于家庭作业,没有明确说明,请:

有没有办法让Prolog只返回程序找到的第一个目标,而忽略找到的其他目标

为了便于说明,给定程序:

permutation([X|Xs],Zs):-permutation(Xs,Ys), insert(X,Ys,Zs).
permutation([],[]).
有没有办法使程序只返回第一个置换作为其唯一的解决方案?在下列情况下:

| ?- permutation([1,2,3],X).

X = [1,2,3] ? ;

X = [1,3,2] ? ;

X = [2,1,3] ? ;

X = [2,3,1] ? ;

X = [3,1,2] ? ;

X = [3,2,1] ? ;

no
我们可以就这样吗

X = [1,2,3] ?;
no

作为解决方案

切割,这是您要寻找的控制。我想,把它放在你需要在顶层提交解决方案的地方。还有一个内置的once/1,它允许限制commit“local”的范围,例如在findall/3中内联的连接中使用。cut是您要查找的控件。我想,把它放在你需要在顶层提交解决方案的地方。还有一个内置的once/1,它允许限制commit“local”的范围,例如在findall/3中内联的连接中使用。只要搜索树中有其他分支,Prolog就会设置choicepoints。为了避免回溯到choicepoint并探索此类备选方案,您必须添加一个剪切/0


您必须检查程序中choicepoint的设置位置,并在该调用之后添加剪切。

只要搜索树中有其他分支,Prolog就会设置choicepoints。为了避免回溯到choicepoint并探索此类备选方案,您必须添加一个剪切/0


您必须检查程序中choicepoint的设置位置,并在该调用后添加剪切。

坚持第一个解决方案的最佳方法是1次/1,因为这样可以使效果尽可能局部。使用/0通常已经产生了意外的效果,因为/0更大。让我们举一个非常简单的例子:查询x=1;X=2;X=3英寸

使用once/1,我们得到:

使用!,我们只得到一个答案:

p2(X) :- ( X = 1 ; X = 2 ; X = 3 ), !.
p2(4).

?- p2(X).
X = 1.
这通常不是有意的

但是,对于第一种解决方案,还有一个更普遍的问题

?- p1(2).
true.

?- dif(X,1),p1(X).
X = 2 ;
X = 4.

那么,2现在也是第一个解决方案?正是出于这样的原因,使用承诺时必须相当谨慎。显示与p1/1类似行为的谓词缺乏稳定性。这样的谓词不能理解为关系,因为它会根据实际查询改变其含义。

坚持第一个解决方案的最佳方法是1次/1,因为这样可以使效果尽可能局部。使用/0通常已经产生了意外的效果,因为/0更大。让我们举一个非常简单的例子:查询x=1;X=2;X=3英寸

使用once/1,我们得到:

使用!,我们只得到一个答案:

p2(X) :- ( X = 1 ; X = 2 ; X = 3 ), !.
p2(4).

?- p2(X).
X = 1.
这通常不是有意的

但是,对于第一种解决方案,还有一个更普遍的问题

?- p1(2).
true.

?- dif(X,1),p1(X).
X = 2 ;
X = 4.
那么,2现在也是第一个解决方案?正是出于这样的原因,使用承诺时必须相当谨慎。显示与p1/1类似行为的谓词缺乏稳定性。这样的谓词不能理解为关系,因为它会根据实际查询改变其含义