coq-club AT inria.fr
Subject: The Coq mailing list
List archive
- From: Samuel Gruetter <gruetter AT mit.edu>
- To: "coq-club AT inria.fr" <coq-club AT inria.fr>
- Subject: Re: [Coq-Club] dealing with open terms in Ltac or Ltac2
- Date: Wed, 15 Jun 2022 22:34:18 +0000
- Accept-language: en-US
- Authentication-results: mail3-smtp-sop.national.inria.fr; spf=None smtp.pra=gruetter AT mit.edu; spf=Pass smtp.mailfrom=gruetter AT mit.edu; spf=None smtp.helo=postmaster AT outgoing-exchange-5.mit.edu
- Ironport-data: A9a23:0OFKXqx7JsBiCdg60kh6t+cPwCrEfRIJ4+MujC+fZmUNrF6WrkUFz 2sbXG6ObKrcYTSkKY8kb43noRxQuMKBx9JmG1NlrlhgHilAwSbnLYTAfx2oZ0t+DeWaERk5t 51GAjXkBJppJpMJjk71atANlVEliefQAOCU5NfsYkidfyc9IMsaoU8lyrdRbrJA24DjWVvT4 I6q+KUzBXf8s9JKGjJMg068gEg31BjCkGtwUosWOJinFHeH/5UkJMp3yZOZdxMUcaEIdgKOf Nsv+Znilo/vE7jBPfv++lrzWhVirrc/pmFigFIOM0SpqkAqSiDfTs/XOdJEAXq7hQllkPh42 Pttn6egTzsOBaftxsMCYTRTFipHaPguFL/veRBTsOSU0lHJdHrqzLBjHEo2NIsX96MqR2RP6 boVJC1lghKr3rLwkfThGq8x16zPL+GzVG8bkn560DzFEfs8aZXCX+PH6cIwMDIY354eTaeFO JtxhTxHfC36eCBlBE4rDL0Bv8GWrULfbARGpwfAzUYwyzGOlVcquFT3C/LefcXPTsFIlG6Dt 2fe9iL4BAsbPZqR01K4HmmEgfLTkiT6Xo1XGa2z9vdsj1DWmyoWCQFQWFemyRWktqKgc9tPB Ww+wTookY8J/m31acbPcha9q0fR63bwROFsO+E97QiMzI/d7ACYGnUIQ1Z9VTA2iCMlbWBwj QHVz7sFERQq7+TNGCLCnluBhWrqYXB9EIMUWcMToeLpCfHIqYQ5lBPDQdsL/EWd1oesQmCYL 9xnukEDa1g7itMX2KK6+1+CjiKnppHPQQNwu0PSX37j4w9kDGJEW2BKwQaHhRqjBN/CJrVkg JTis5PBhAzpJcrc/BFhuM1XQNmUCw+taVUwe2JHEZg77CiK8HW+Z41W6zwWDB43b5tfIGC5O hCJ5145CHpv0J2CM/Efj2WZVZpC8EQcPYuNug38NIMXOsQvKGdrAgk0Oh7Lt4wSrKTcufhiY MzAGSpdJXMTEr9uxzqrXOoBzaRjxyYl2WLPWIz2hxOpmaaTb36TTrMCP0rmUwzKxPzsnekhy P4Gb5Hi40wHDoXWO3CLmaZOcwxiBSVlVPje9pwGHsbec1EOMDxwW5f5n+h7E6Q7xPs9qws91 irgMqOu4AGj3iKvxMTjQiwLVY4Dqr4k/ClmbHR8YQnzs5XhCK72hJoim1IMVeFP3IReITRcF pHpou2MXaZCTCrp4TMYYcWvpYBubkv5gAOSeSepfWFnLZJnQgXI/P7ifxfuqHlTUHfr6ZNmr u3yzB7fTLoCWx9mUJTcZsWpwg7jpnMagu9zAxbFL4ALKkXh+YRnMQLrifozL51eIBnP3GTI0 geKRxoUuLCV8YMy9dDIg4GCrpuoT7sjQBcGQzGD4O/vZyfA/2elzYtRa8qyfGjQBDHu5aGvR eRJ1PWgYvcJq1BH7thnGLFxwKNiutbiquMIzglgG3mXPV2nBqk6fSuBwNVAsaxLyfpUqQC2U 0SA95wHf7CIJIXoHENIfFgpaeGK1Pc1nDjO7KhlfRunuHMvpLfXA19POxSsiTBGKOcnOo0Sx +p86tUd7Bayi0Z3P9va3DpY8X+Aci4JX6k97M5IB5L3hQ0qzF4HbIzXCibw75zKNpNJM1VsL zOJ3fKQi7NZz0vEUnwyCXmRjbcD2MhS4EhHnA0YOlCEutvZnftrjhdfxjI6E1ZOxRJd3uMvZ 2VmOiWZ/0lVE+uEWSSCY4ytJ+2FLBqE5kP2yl0G0WDJREmhUGPAaTB7POeRuk0V7gqwu9SdE K6wkA7YvfTCJakdHRfenWZgquClQNBsnuEHsN7yBNyLRvHWfhK86pJDpgM0R9/PBMItwkDLu IGGOQq2hbLTbUYtnkHwN2VWOXn8hvxJyKyujMyNJJ80IFw=
- Ironport-hdrordr: A9a23:uvK5DqseZ9/pTjlJQod+pbmV7skDutV00zEX/kB9WHVpm5Sj5r mTdGxy726EtN9jYgBZpTnmAtjxfZq8z+8K3WB1B92ftWbdyQ6Vxe1Zg7cKhgeQfREWldQtpp uIEZIObOEYZGIS5a2WjGaF+pQbsb66GcuT5ds2uk0dLz2CHJsQjDuRZDz7LqQ8fng8OXNwLu vn2iJtzwDQBEj+eKyAdwU4tsb41qL2qK4=
- Ironport-phdr: A9a23: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 U6RVTF4McjDQHrNPpROBGJc5c/Ew2o=
- Ironport-sdr: JwOA5CmsP8Nqp2sISnYFW1Jk/iyrCwO8T5vxmdx+2mkM2s94g/gPJpoGbyVOjSpu+8O9nMLaxl 0Opm9YqBCiIpnLcsWc4HxubRfMt5zVW62UoqtBczL88sSHbUObSPbB/z2lJtEDQPfEEO4Nw38b 6x9FXXTvUGToYZCSlZcSSwOwuBfjRq7WwW7qsWkUdBvBryi/2HvmDQfSjJlCutDyUGhHmF+UT7 Fb79ubL6m2tAp+JjRgiU3xuClmY+v2LkjGTTm/lUhcr09sq39pV+Fufn9jcSDFpDZgQ2J7bsOw 8yGdrVcy0lcJYX4C9rq51AXG
Hi Benjamin,
Below is some Ltac code that works on your example, as well as on one
additional example. Whether such Ltac code is the most principled,
readable and beautiful solution that everyone should use all the time,
that's a different question though... ;-)
Best,
Samuel Gruetter
===========
Notation "'subst!' y 'for' x 'in' f" :=
(match y with x => f end) (at level 10, f at level 200).
Ltac beta1 func arg :=
lazymatch func with
| (fun a => ?f) => constr:(subst! arg for a in f)
end.
Ltac wrap names vals t :=
lazymatch names with
| nil => t
| cons ?y ?ys => constr:(let (v0, rest0) := vals in ltac:(
let t' := wrap ys rest0 t in
lazymatch eval pattern y in t' with
| ?f y => let t'' := beta1 f v0 in exact t''
end))
end.
Lemma test_wrap: forall a b c: nat,
(fun (z: pp 3) => ltac:(
let r := wrap (cons a (cons b (cons c nil))) z (a + b = c) in
exact r)) (a, (b, (c, I))) =
(fun (z: pp 3) => a + b = c) (a, (b, (c, I))).
Proof. intros. reflexivity. all: fail. Abort.
Ltac reify_rec n env t :=
lazymatch t with
| ?a -> ?b =>
let ra := reify_rec n env a in
let rb := reify_rec n env b in
constr:(imp n ra rb)
| forall x: nat, @?body' x =>
let y := fresh "y" in
lazymatch constr:(fun y: nat => ltac:(
let body := beta1 body' y in
let r := reify_rec (S n) (cons y env) body in
exact r))
with
| (fun _: nat => ?r) => constr:(fa n r)
end
| _ => constr:(Hole n (fun (z: pp n) =>
ltac:(let r := wrap env z t in exact r)))
end.
Ltac reify_goal :=
lazymatch goal with
| |- ?g => let r := reify_rec 0 (@nil nat) g in change (coerce 0 r I)
end.
Set Ltac Backtrace. (* helps with debugging Ltac *)
Goal forall x : nat, x=2 -> x=3.
reify_goal. simpl.
Abort.
Goal forall a: nat, a + a = 2 -> forall b: nat, a + b = 3 -> b = 2.
reify_goal. simpl.
Abort.
-----Original Message-----
From: Benjamin Werner <benjamin.werner AT inria.fr>
Reply-To: coq-club AT inria.fr
To: coq-club AT inria.fr
Subject: [Coq-Club] dealing with open terms in Ltac or Ltac2
Date: Wed, 15 Jun 2022 15:02:16 +0200
Hello,
I am sorry in case this topic has already been covered, please feel
free to refer me to older posts.
I want to write a tactic which does a reification, like in the first
step of, say, the ring tactic. The problem
is I want to construct a structure which includes some binders, which
means the tactic probably needs
to deal with open terms, and this seems problematic if sticking to Ltac
or Ltac2.
Here is a simple example. It is not precisely what I want to do, but if
one can do the following, it would
be a good step. From what I understand, one probably needs to dive into
caml code, but I would be very
happy if this was not the case.
Thank you in advance, best wishes,
Benjamin
===========
Fixpoint pp (n : nat) : Type :=
match n with
| 0 => True
| S n => nat * (pp n)
end.
(* a first-order fragment of Prop *)
Inductive cx : nat -> Type :=
> Hole : forall n, ((pp n) -> Prop) -> (cx n)
> imp : forall n, (cx n) -> (cx n) -> (cx n)
> fa : forall n, cx (S n) -> cx n.
(* translating back into Prop *)
Fixpoint coerce (n:nat) (c:cx n) : (pp n) -> Prop :=
match c with
> Hole _ P => P
> imp _ c d => fun x => ((coerce _ c x) -> (coerce _ d x))
> fa _ c => fun x => forall p:nat, (coerce _ c (p, x))
end.
(* stupid example *)
Goal forall x : nat, x=2 -> x=3.
(* I want a tactic able to do something like that : *)
(* but without me having to type the cx explicitely *)
change (coerce 0
(fa 0
(imp 1
(Hole 1 (fun z => let (x,_) := z in (x=2)))
(Hole 1 (fun z => let (x,_) := z in
(x=3)))))
I).
- [Coq-Club] dealing with open terms in Ltac or Ltac2, Benjamin Werner, 06/15/2022
- Re: [Coq-Club] dealing with open terms in Ltac or Ltac2, Yannick Forster, 06/15/2022
- Re: [Coq-Club] dealing with open terms in Ltac or Ltac2, Samuel Gruetter, 06/16/2022
- Re: [Coq-Club] dealing with open terms in Ltac or Ltac2, Benjamin Werner, 06/16/2022
Archive powered by MHonArc 2.6.19+.