Prolog peano 数字 difference/subtraction
Prolog peano numbers difference/subtraction
我正在尝试计算 'Peano numbers' (Recursive definition of natural numbers represented as s(0), s(s(0)) etc.
) 的差异,但我有点被一个问题困住了。
减法的定义如下:
s(X) - 0 = s(X)
s(X) - s(s(X)) = 0
s(X) - s(X) = 0
s(s(X)) - s(X) = s(0)
0 - s(X) = 0
这是我当前的代码:
nat(0).
nat(s(X)) :- nat(X).
% sub/3
% Subtracts right operand from left operand and returns difference
sub(0, _, 0).
sub(X, 0, X).
sub(s(X), s(Y), X) :-
sub(X,Y,X).
我的思考过程:
因为我真的不需要递归地增加差异,所以我可以使用递归后我留下的最后一个 X
作为结果。
出于某种原因,以下问题有效:
?- sub(s(0), s(0), X).
X = 0 ;
但是这个没有:
?- sub(s(s(0)), s(s(0)), X).
false.
任何人都可以指出我的错误或建议更好的方法来实现子程序吗?
这可能是初学者的错误,因为我真的没有做太多。抱歉,如果是这样的话。
//编辑
我就是这样解决的
sub(X, 0, X).
sub(0, _, 0).
% not sure why I didn't test this before, thought I did.
sub(s(X), s(Y), Diff) :-
sub(X,Y,Diff).
sub(s(X), s(Y), X) :- sub(X,Y,X).
说
You can prove that s(X)-s(Y) = X
if you can prove that X-Y = X
这有点奇怪。那里应该有第三个变量,Z
.
Prolog 试图证明(使真)
sub(s(s(0)), s(s(0)), X).
如果
可以做到
sub(s(0),s(0),s(0)).
因为规则的右侧是通过 LHS 模式匹配设置 X=s(0)
和 Y=s(0)
来设置的。
再次尝试证明此 sub(s(0),s(0),s(0))
意味着使用规则(没有其他适用),设置 X=0
、Y=0
、X=s(0)
。但是 X
不能既是 0
又是 s(0)
。僵局! false
.
我正在尝试计算 'Peano numbers' (Recursive definition of natural numbers represented as s(0), s(s(0)) etc.
) 的差异,但我有点被一个问题困住了。
减法的定义如下:
s(X) - 0 = s(X)
s(X) - s(s(X)) = 0
s(X) - s(X) = 0
s(s(X)) - s(X) = s(0)
0 - s(X) = 0
这是我当前的代码:
nat(0).
nat(s(X)) :- nat(X).
% sub/3
% Subtracts right operand from left operand and returns difference
sub(0, _, 0).
sub(X, 0, X).
sub(s(X), s(Y), X) :-
sub(X,Y,X).
我的思考过程:
因为我真的不需要递归地增加差异,所以我可以使用递归后我留下的最后一个 X
作为结果。
出于某种原因,以下问题有效:
?- sub(s(0), s(0), X).
X = 0 ;
但是这个没有:
?- sub(s(s(0)), s(s(0)), X).
false.
任何人都可以指出我的错误或建议更好的方法来实现子程序吗?
这可能是初学者的错误,因为我真的没有做太多。抱歉,如果是这样的话。
//编辑 我就是这样解决的
sub(X, 0, X).
sub(0, _, 0).
% not sure why I didn't test this before, thought I did.
sub(s(X), s(Y), Diff) :-
sub(X,Y,Diff).
sub(s(X), s(Y), X) :- sub(X,Y,X).
说
You can prove that s(X)-s(Y) = X
if you can prove that X-Y = X
这有点奇怪。那里应该有第三个变量,Z
.
Prolog 试图证明(使真)
sub(s(s(0)), s(s(0)), X).
如果
可以做到sub(s(0),s(0),s(0)).
因为规则的右侧是通过 LHS 模式匹配设置 X=s(0)
和 Y=s(0)
来设置的。
再次尝试证明此 sub(s(0),s(0),s(0))
意味着使用规则(没有其他适用),设置 X=0
、Y=0
、X=s(0)
。但是 X
不能既是 0
又是 s(0)
。僵局! false
.