我想定义一个函数PCollection
w / 2个显式参数。 f
的参数类型和值是某些f
的应用程序。假设参数的类型为g
和g x y
。棘手的部分是 g z w
的值必须取决于f
和x
的统一性。以下是定义失败的z
的天真尝试。我应该怎么解决这个问题?
f
答案 0 :(得分:2)
的统一性
f
的值必须取决于x
和z
写这样的定义是不可能的。假设您可以编写一个函数来判断两个自然数是否统一,称之为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 + y
和y + 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并使用统一来推断n
和m
的类型:
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*)