我正在尝试编写一个谓词,它返回两个数字之间的最小值和最大值。
min
和max
谓词工作正常,但是当我尝试使用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).
答案 0 :(得分:1)
您的min/2
和max/2
不确定,因此可以寻找替代方案。评估时
min_max(2,5,X,Y).
你看
X = 2,
Y = 5
它暂停,等待你的输入。如果您按.
,则会成功。但是,如果按;
,它会搜索备选项,而找不到备选项,则会失败。
您需要将min/2
和max/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/2
和max/2
来消除选择点,我们在下降时有效地修剪树,为我们留下一个解决方案。
答案 1 :(得分:1)
如何以稍微不同的方式合并hällö
和min/3
?
考虑这个定义:
max/3
示例查询:
min_max(X,Y,X,Y) :- X =< Y.
min_max(X,Y,Y,X) :- Y < X.