返回prolog-false而不是数字

时间:2015-06-08 21:07:43

标签: prolog

我正在尝试编写一个谓词,它返回两个数字之间的最小值和最大值。 minmax谓词工作正常,但是当我尝试使用min_max函数min_max(2,5,X,Y)时,我会得到错误。 有人可以帮忙吗?

min(X,Y,X) :- X=<Y.
min(X,Y,Y) :- Y<X.

max(X,Y,Y) :- X=<Y.
max(X,Y,X) :- Y<X.

min_max(X,Y,MIN,MAX) :-
   min(X,Y,MIN),
   max(X,Y,MAX).

2 个答案:

答案 0 :(得分:1)

您的min/2max/2 不确定,因此可以寻找替代方案。评估时

min_max(2,5,X,Y).

你看

X = 2,
Y = 5

它暂停,等待你的输入。如果您按.,则会成功。但是,如果按;,它会搜索备选项,而找不到备选项,则会失败。

您需要将min/2max/2修改为确定,如下所示:

min(X,Y,Z) :- ( X < Y -> Z = X ; Z = Y ) .

max(X,Y,Z) :- ( X > Y -> Z = X ; Z = Y ) .

[->运算符(含义)有效地充当“软切”,消除了替代方案。]

一旦你这样做,它将按照你的预期工作,而不会暂停你的输入(因为你已经消除了选择点):

13 ?- min_max(2,5,X,Y).
X = 2,
Y = 5.

14 ?- 

如果你认为你的prolog程序是一个树的选择点作为分支(和作为叶节点的解决方案),它可能会有所帮助。 prolog引擎在那棵树上运行,试图找到解决方案。

在原始程序中,min_max/4有4个可能的解决方案(min/2为2,max/2为2),即使只有一个“功能“解决方案。在回溯时,prolog引擎试图找到替代解决方案并找不到,失败。

通过重写min/2max/2来消除选择点,我们在下降时有效地修剪树,为我们留下一个解决方案。

答案 1 :(得分:1)

如何以稍微不同的方式合并h&auml;ll&ouml; min/3? 考虑这个定义:

max/3

示例查询:

min_max(X,Y,X,Y) :- X =< Y.
min_max(X,Y,Y,X) :- Y  < X.