1

我需要在活页夹下概括表达。例如,我的目标中有两个表达式:

(fun a b => g a b c)

(fun a b => f (g a b c))

我想概括一下g _ _ c

一种方法是先将它们重写为:

(fun a b => (fun x y =>  g x y c) a b)

第二个进入:

(fun a b =>
   f (
       (fun x y =>  g x y c) a b
   ))

然后,概括(fun x y, g x y c)somefuntype A -> A -> A。这会将我的表达式变成:

(fun a b => somefun a b)

(fun a b => f (somefun a b))

这里的困难是我试图概括的表达是在活页夹下。我找不到操纵它的策略或 LTAC 表达式。我怎么能做这样的事情?

4

1 回答 1

3

这个答案有两个关键:change策略,它用一个可转换的术语替换一个术语,以及概括c,以便您处理 not g _ _ cbut fun z => g _ _ z;这第二个键允许您处理g而不是g应用于其参数。在这里,我使用pose策略来控制哪些功能应用程序会降低 β:

Axiom A : Type.
Axiom f : A -> A.
Axiom g : A -> A -> A -> A.
Goal forall c, (fun a b => g a b c) = (fun a b => f (g a b c)).
Proof.
  intro c.
  pose (fun z x y => g x y z) as g'.
  change g with (fun x y z => g' z x y).
  (*   (fun a b : A => (fun x y z : A => g' z x y) a b c) =
       (fun a b : A => f ((fun x y z : A => g' z x y) a b c)) *)
  cbv beta.
  (* (fun a b : A => g' c a b) = (fun a b : A => f (g' c a b)) *)
  generalize (g' c); intro somefun; clear g'.
  (* (fun a b : A => somefun a b) = (fun a b : A => f (somefun a b)) *)

这是一个替代版本,它使用id(标识函数)来阻止cbv beta,而不是使用pose

Axiom A : Type.
Axiom f : A -> A.
Axiom g : A -> A -> A -> A.
Goal forall c, (fun a b => g a b c) = (fun a b => f (g a b c)).
Proof.
  intro c.
  change g with (fun a' b' c' => (fun z => id (fun x y => g x y z)) c' a' b').
  (*   (fun a b : A =>
        (fun a' b' c' : A => (fun z : A => id (fun x y : A => g x y z)) c' a' b') a b c) =
       (fun a b : A =>
        f
          ((fun a' b' c' : A => (fun z : A => id (fun x y : A => g x y z)) c' a' b') a
             b c)) *)
  cbv beta.
  (* (fun a b : A => id (fun x y : A => g x y c) a b) =
     (fun a b : A => f (id (fun x y : A => g x y c) a b)) *)
  generalize (id (fun x y : A => g x y c)); intro somefun.
  (* (fun a b : A => somefun a b) = (fun a b : A => f (somefun a b)) *)
于 2017-09-29T18:19:44.323 回答