我正在尝试为二进制自然数(位列表)定义前趋函数。我想将我的函数输入限制为被修剪的数字(没有前导零)并且是正数(所以,我不必担心零的前身)。
以下是运算符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
。
我该如何证明这一点?
答案 0 :(得分:2)
这个目标确实微不足道,因为你可以为Empt案例返回任何自然数,并且放心,没有人能够达到这个数字,因为他们首先必须传入适当的H2 : is_pos nat1 H1
。
我认为解决这种问题的下一个“正确”方法是使用依赖模式匹配,如下所示:
Program Fixpoint pred (nat1: Nat) (H1: is_trim nat1 = True) (H2: is_pos nat1 H1 = True): Nat :=
match nat1 as nat1' return is_pos nat1' H1 -> Nat with
| Empt => fun isposEmpt =>
(* hopefully, is_pos Empt H1 immediately reduces to False, and you can do this: *)
False_rec Nat isposEmpt
| Fill Zer nat2 => fun _ => Fill One (pred nat2 H1 H2)
| Fill One nat2 => fun _ => Fill Zer nat2
end H2.
也就是说,你需要一个证明nat1是积极的证据作为你的比赛的参数,你在Empt案例中得出证据证明这是伪造的,所以你也可以归还伪造。
希望这有效并且有道理。请在下次提供必要的定义,以帮助人们玩你的例子。