我有以下令人烦恼的问题。 我已经实现了以下功能:
function bool less(nat x, nat y) {
if (y<>0) then
if (x<>0) then
return less(x-1,y-1);
else
return true;
end;
else
return false;
end;
end;
如何显示所有x,y以下内容 较少(x,y)和较少(y,x)是不可能的 同一时间?
再见
(c)2010年,Jan Burse,8004Zürich
答案 0 :(得分:2)
好吧,首先我会请你考虑less(-1, -2)
的情况,所以我们必须定义函数在n≥0的范围内。当第一个输入等于第二,它将对两个排序都返回true,所以我们必须假设x≠y。
我会使用矛盾证明。
假设对于某些x和某些y,其中x和y都是≥0且x≠y,则较小的(x,y)和较小的(y,x)都为真。
这意味着当x和y都非零时,你从它们中减去一次n次,直到其中一个为零,首先检查x。当第一个操作数达到零时,该函数返回true;当第二个操作数达到零时,该函数返回false,而第一个操作数为非零。
有两种情况:
根据我们的假设,less(x,y)返回true,意味着函数迭代x次,之后x - x(1)= 0且y - x(1)> 0(因为y≠x,并且函数在手之前没有返回false)。
类似地,less(y,x)返回true,意味着函数迭代y次,之后y-y(1)= 0并且x-y(1)> 0。 0(与以前相同的原因)。
这给了我们两个有用的关系:y - x > 0
和x - y > 0
。重新排列:y > x
和x > y
(函数的语义,但我们从函数如何工作的定义中实现了这一点,并将它简化为纯数学,我们可以使用某些公理对)。
从y > x
和x > y
,您可以重新排列为x > x
和y > y
(如果x大于y,那么它大于y大于y的所有内容。y大于x,因此x大于x)。
这是一个逻辑矛盾,因此我们的假设(它们都是真的)是不正确的。
因此,通过矛盾证明,当x≠y,并且x,y≥0时,函数less
对于less(x,y)和less(y,x)都不能返回true。
(已经有一段时间了,因为我必须做一个证明(虽然我不得不做一些事情,所以这是一个好习惯)所以我可能有点生疏。如果有人看到错误,请指出来,我会尝试解决它)