gpt4 book ai didi

coq - 如何编写行为类似于 "destruct ... as"的策略?

转载 作者:行者123 更新时间:2023-12-03 21:57:37 25 4
gpt4 key购买 nike

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

coq 中的 Ltac 语言允许用户编写自定义策略。我想写(事实上,保持)一个策略,在将控制权交给 destruct 之前做一些事情。 .

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

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

最佳答案

您可以使用 reference manual 中描述的策略符号。 .例如,

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_intropattern指令指示 Coq 解释 bar作为介绍模式。因此,调用 foo导致调用 destruct H 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.

我们可以检查生成的目标之一,以了解名称的使用情况。
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')

关于coq - 如何编写行为类似于 "destruct ... as"的策略?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30134754/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com