Coq 我该如何编写“类似于”的策略;破坏。。。“作为”吗;?

Coq 我该如何编写“类似于”的策略;破坏。。。“作为”吗;?,coq,ltac,Coq,Ltac,在coq中,该策略有一个接受“合取-析取引入模式”的变体,允许用户为引入的变量分配名称,即使在解包复杂归纳类型时也是如此 coq中的Ltac语言允许用户编写自定义策略。我想写一个(事实上,是维护)策略,在将控制权交给析构函数之前做一些事情 我希望我的自定义策略允许(或要求,以较容易的为准)用户提供一个介绍模式,我的策略可以将其交给destruct 什么样的Ltac语法实现了这一点?您可以使用战术符号,如中所述。比如说, Tactic Notation "foo" simple_intropatt

在coq中,该策略有一个接受“合取-析取引入模式”的变体,允许用户为引入的变量分配名称,即使在解包复杂归纳类型时也是如此

coq中的Ltac语言允许用户编写自定义策略。我想写一个(事实上,是维护)策略,在将控制权交给
析构函数之前做一些事情

我希望我的自定义策略允许(或要求,以较容易的为准)用户提供一个介绍模式,我的策略可以将其交给
destruct


什么样的Ltac语法实现了这一点?

您可以使用战术符号,如中所述。比如说,

Tactic Notation "foo" simple_intropattern(bar) :=
  match goal with
  | H : ?A /\ ?B |- _ =>
    destruct H as bar
  end.

Goal True /\ True /\ True -> True.
intros. foo (HA & HB & HC).
simple\u intropattern
指令指示Coq将
bar
解释为一个intro模式。因此,调用
foo
会导致调用
destructh as(HA&HB&HC)

下面是一个较长的示例,显示了更复杂的引入模式

Tactic Notation "my_destruct" hyp(H) "as" simple_intropattern(pattern) :=
  destruct H as pattern.

Inductive wondrous : nat -> Prop :=
  | one         : wondrous 1
  | half        : forall n k : nat,         n = 2 * k -> wondrous k -> wondrous n
  | triple_one  : forall n k : nat, 3 * n + 1 = k     -> wondrous k -> wondrous n.

Lemma oneness : forall n : nat, n = 0 \/ wondrous n.
Proof.
  intro n.
  induction n as [ | n IH_n ].

  (* n = 0 *)
  left. reflexivity.

  (* n <> 0 *)
  right. my_destruct IH_n as
    [ H_n_zero
    | [
      | n' k H_half       H_wondrous_k
      | n' k H_triple_one H_wondrous_k ] ].

Admitted.
战术符号“my_destruct”hyp(H)”为“简单模式(pattern)”:=
破坏H为模式。
感应奇妙:自然->道具:=
|一:奇妙的1
|一半:对于所有n k:nat,n=2*k->奇妙的k->奇妙的n
|三合一:对于所有的n k:nat,3*n+1=k->奇妙的k->奇妙的n。
引理合一性:forall n:nat,n=0\/奇妙的n。
证明。
简介。
归纳法n as[|n IH|n]。
(*n=0*)
左边自反性。
(*n0*)
正确的。我的自毁
[H_n_zero
| [
|好吧,一半好吧,太棒了
|n'k H_三重_一_奇妙_k]]。
承认。
我们可以检查其中一个生成的目标,以查看名称是如何使用的

oneness < Show 4.
subgoal 4 is:

  n : nat
  n' : nat
  k : nat
  H_triple_one : 3 * n' + 1 = k
  H_wondrous_k : wondrous k
  ============================
   wondrous (S n')
oneness