我正在尝试将Coq策略(当前用Ltac编写)移植到OCaml,以便能够更轻松地扩展该策略(并避免我需要在Ltac中模仿的数据结构,这些数据结构本来就相当OCaml中的标准)。
我目前面临以下问题:
k
(旨在作为延续)作为OCaml策略?k
应用于给定的constr v
?tac
?tac ltac:(fun r => ...)
)我在Coq来源搜索TACTIC EXTEND
上做了一个grep,但是没有找到这种方法的示例...
作为一个最小的示例,下面是我想依靠现有Ltac策略running_example
移植到OCaml中的玩具Ltac策略tac
:
Require Import Reals.
Inductive type := Cstrict (ub : R) | Clarge (ub : R).
Ltac tac g k :=
let aux c lb := k (c lb) in
match g with
| Rle ?x ?y => aux Clarge y
| Rge ?x ?y => aux Clarge x
| Rlt ?x ?y => aux Cstrict y
| Rgt ?x ?y => aux Cstrict x
end.
Ltac running_example expr (*point 1*) k :=
let conc := constr:((R0 <= expr)%R) in
tac (*point 3*) conc (*point 4*) ltac:(fun r => let v :=
match r with
| Clarge ?x => constr:((true, x))
| Cstrict ?x => constr:((false, x))
end in (*point 2*)
k v).
Goal True.
running_example 12%R ltac:(fun r => idtac r).
(* Should display (true, 12%R) *)
到目前为止,我已经获得了下面的代码(仅处理第1点):
open Ltac_plugin
open Stdarg
open Tacarg
TACTIC EXTEND running_example
| [ "running_example" constr(expr) tactic0(k) ] ->
[ Proofview.Goal.nf_enter begin fun gl ->
(Tacinterp.tactic_of_value ist k) end ]
END
任何指针或建议都非常欢迎。