我正在尝试为二进制自然数(位列表)定义前置函数。我想将我的函数的输入限制为修剪过的数字(没有前导零)并且是正数(所以,我不必担心零的前身)。
这是运算符的定义pred
:
Program Fixpoint pred (nat1: Nat) (H1: is_trim nat1 = True) (H2: is_pos nat1 H1 = True): Nat :=
match nat1 with
| Empt => _
| Fill Zer nat2 => Fill One (pred nat2 H1 H2)
| Fill One nat2 => Fill Zer nat2
end.
我的第一个义务如下:
nat1: Nat
H1: is_trim nat1 = True
H2: is_pos nat1 H1 = True
H3: Empt = nat1
______________________________________(1/1)
Nat
但是,我不知道如何解决它。
矛盾显然在H2
。但是,因为它取决于H1
,所以我不能只rewrite nat1
使用Empt
,然后(is_pos Empt H1)
使用False
。
我应该如何证明这一点?