Coq:将使用CPS样式的Ltac策略移植到ML策略(OCaml插件)

时间:2018-09-04 18:51:25

标签: coq coq-tactic ltac coq-plugin

我正在尝试将Coq策略(当前用Ltac编写)移植到OCaml,以便能够更轻松地扩展该策略(并避免我需要在Ltac中模仿的数据结构,这些数据结构本来就相当OCaml中的标准)。

我目前面临以下问题:

  1. 我们是否可以定义Ltac表达式k(旨在作为延续)作为OCaml策略?
  2. 我们如何将这样一个Ltac表达式k应用于给定的constr v
  3. 我们如何从插件中调用给定的Ltac策略tac
  4. 能否从插件代码中将Ltac闭包传递给这样一种策略? (以在OCaml中实现Ltac习惯用法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

任何指针或建议都非常欢迎。

0 个答案:

没有答案