gpt4 book ai didi

prolog - Prolog:为什么这是一个“坏”程序?

转载 作者:行者123 更新时间:2023-12-01 12:02:32 28 4
gpt4 key购买 nike

max(M,N,M):-M >= N,!.
max(M,N,N).

我正在读一本教科书,说陈述性和程序性含义不同...我不知道该怎么做。

有人可以指出我正确的方向吗?

最佳答案

tl; dr:这不是关系。

有一个非绿色的切口。其实是红色的。要看到这一点,请去除切口,您会注意到,您得到了两种不同的解决方案

?- max(1,0,N). % without the cut
N = 1
; N = 0.

如果第二子句显示为: 将是,是一个绿色部分。
max(M,N,N) :- M < N.

切割发生的确切条件是什么?它不是 而不是 M >= N,而是暗示了进一步的条件,即 A1 = A3, ...,它不是直接可见的,因为它仅通过重复出现变量来显示:
max(M,N,M):-M >= N,!.
^
|
+ hidden equality

通过利用隐藏的相等性,我们可以轻松地构造一个不一致的示例:
MN这样的 M > N并将 N放在第三个arg中(尽管我们知道这是错误的)。
?- max(1, 0, 0).   % the original version
true. % very wrong!
?- max(1, non_number, non_number).
true. % even wronger!
?- max(an-other, non_number, non_number).
true. % wrongest!!

为了解决这个问题,我们必须推迟削减之后的统一。
max(M,N,R):- M >= N,!, R = M.
max(M,N,N).

现在一切都固定了吗?不幸的是没有...

结果是什么?是数字吗
?- max(1+0,0, R).
R = 1+0.

不总是。也许可以将其定义为:
max(M,N,R):- M >= N,!, R is M.
max(M,N,R) :- R is N.

关于什么
?- max(0,N,1).
ERROR: Arguments are not sufficiently instantiated

但是..对此只有一个解决方案!即 N = 1
很复杂,不是吗?好吧,originallz,Prolog根本不做算术。后来它被修补了。当前表达该关系的最佳方法是使用当前的 library(clpz)(@ SICStus,@ Scryer)或不再维护的 library(clpfd)(@SWI)。
:- op(150, fx, #).   % only needed on SWI
max(M, N, Max) :-
max(#M,#N) #= #Max.

现在,这实际上定义了整数的最大关系(但未定义浮点数...)。

关于prolog - Prolog:为什么这是一个“坏”程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60363474/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com