Coq:定义一个特殊功能

时间:2018-01-14 00:45:00

标签: function coq

我想定义一个函数PCollection w / 2个显式参数。 f的参数类型和值是某些f的应用程序。假设参数的类型为gg x y。棘手的部分是 g z w的值必须取决于fx 的统一性。以下是定义失败的z的天真尝试。我应该怎么解决这个问题?

f

1 个答案:

答案 0 :(得分:2)

  

f的值必须取决于xz

的统一性

写这样的定义是不可能的。假设您可以编写一个函数来判断两个自然数是否统一,称之为unify_nat : nat -> nat -> bool。现在考虑函数

F := fun x y : nat => if unify_nat (x + y) (y + x) then True else False
G := fun x y : nat => if unify_nat (x + y) (x + y) then True else False

我们可以证明,因为加法是可交换的,forall x y, F x y = G x y。但是,unify_nat (x + y) (y + x)必须返回true,即使x + yy + x没有统一。

你可以做两件事:(1)你可以不询问这些术语是否统一,但是如果它们在命题上是平等的; (2)你可以写一个符号或别名,就像定义的语法糖一样。

<强> 1

命令Scheme Equality将为大多数归纳类型生成等式决策函数:

Scheme Equality for A.
Definition f {x y z w}(n: g x y)(m: g z w) :=
  if A_beq x z then g z b else g fa b.

Compute f gab ga0b. (*= g fa b: C*)
Compute f gab gab. (*= g a b: C*)

<强> 2

我们可以使用open_constr:(_)创建evars并使用统一来推断nm的类型:

Ltac f_tac n m :=
  let x := open_constr:(_) in
  let y := open_constr:(_) in
  let z := open_constr:(_) in
  let w := open_constr:(_) in
  let n := constr:(n : g x y) in
  let m := constr:(m : g z w) in
  match x with z => exact (g z b) | _  => exact (g fa b) end.
Notation f n m := (ltac:(f_tac n m)) (only parsing).

Compute f gab ga0b. (*= g fa b: C*)
Compute f gab gab. (*= g a b: C*)