重写依赖函数

时间:2012-11-24 21:03:19

标签: coq dependent-type

我正在尝试为二进制自然数(位列表)定义前趋函数。我想将我的函数输入限制为被修剪的数字(没有前导零)并且是正数(所以,我不必担心零的前身)。

以下是运算符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

我该如何证明这一点?

1 个答案:

答案 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案例中得出证据证明这是伪造的,所以你也可以归还伪造。

希望这有效并且有道理。请在下次提供必要的定义,以帮助人们玩你的例子。