这个问题与我在假期期间以Coq用户为参与者调查的战略游戏(讨价还价,协议,加密货币...)设置有关。
其中一些推理能力有限,例如只能介绍和应用假设或引理。
其他一些人可能会使用tauto。
相反,一些理性的参与者具有无限的推理能力,并且知道其他参与者的类型。因此,理性的玩家可以思考其他玩家可以证明或不证明的内容,并为下一步游戏做出决策。
非理性参与者永远无法获得CIC条款。因此,我将其Ltac语法限制为一致但较小的片段。我还限制了他们的基本战术清单。例如,我不允许带有模式或其他样式的apply变体为CIC条款敞开大门。
在这个问题上,它只是香草介绍的有限序列,并采用以点分隔的策略。
总而言之,玩家的类型由Ltac语法子集,原子策略列表和游戏开始时给出的一袋引理定义。
这是重言式中最冗长(最小的步骤)的证明:
Lemma Or_commutative : forall P Q : Prop, P \/ Q -> Q \/ P.
Proof.
intro P.
intro Q.
intro H.
elim H.
intro HP.
right.
apply HP.
intro HQ.
left.
apply HQ.
Qed.
很明显,我们需要精简,左右策略。介绍和申请还不够。
问题:我怎么能证明她不能仅凭介绍和申请就可以证明Or_commutative?
Goal cannot_prove_or_commutative_with_IAs : ????
Proof.
(* Here I want to show that no sequence of
vanilla intro and apply tactics can solve the goal*)
(* I may define a structure of proof that is a sequence of intro and apply
and show that after step 3, it will fail or will not change the judgment.
How would I do that ? *)
(* Or should I go to the definitions of intro an apply and show that they cannot
handle OR terms ? *)
(* Or should I investigate plugins to reflect on tactics ? I heard of Mtac2 recently *)
Qed.
答案 0 :(得分:1)
要陈述该定理,您需要定义一个Coq数据类型,该数据类型捕获要使用的命题的语法以及相关的推理规则。只要您愿意形式化,它就可以包含尽可能多的Coq。为了说明您的可交换性结果,我们需要的是一个简单的,带有析取和蕴涵的命题逻辑。
Inductive prop : Type :=
| Atomic : nat -> prop (* Basic propositions *)
| Or : prop -> prop -> prop
| Implies : prop -> prop -> prop.
Definition commutativity :=
Implies (Or (Atomic 0) (Atomic 1)) (Or (Atomic 1) (Atomic 0)).
我们可以给这种逻辑赋予语义,将其与Coq附带的真理概念联系起来; assn
用于解释原子命题:
Fixpoint sem (assn : nat -> Prop) (P : prop) :=
match P with
| Atomic x => assn x
| Or P Q => sem assn P \/ sem assn Q
| Implies P Q => sem assn P -> sem assn Q
end.
使用包含关系来对证明进行形式化,而不是使用策略,这更加容易和普遍,它指出了何时可以从一系列假设中证明一个定理。以下定义给出了上述片段的所有有用规则:
Require Import Coq.Lists.List.
Inductive entails : list prop -> prop -> Type :=
| Ax : forall P G, In P G -> entails G P
| OrIL : forall G P Q, entails G P -> entails G (Or P Q)
| OrIR : forall G P Q, entails G Q -> entails G (Or P Q)
| OrE : forall G P Q R,
entails (P :: G) R ->
entails (Q :: G) R ->
entails G (Or P Q) ->
entails G R
| ImpliesI : forall G P Q,
entails (P :: G) Q ->
entails G (Implies P Q)
| ImpliesE : forall G P Q,
entails G (Implies P Q) ->
entails G P ->
entails G Q.
应该有可能证明一个定理定理,说从这些推理规则建立的证明产生了有效的定理:
Theorem soundness assn G P :
entails G P ->
Forall (sem assn) G -> sem assn P.
仅允许intros
和apply
等于排除对OrE
的使用,我们可以使用布尔谓词来强制使用:
Fixpoint no_destruct {G P} (pf : entails G P) : bool :=
match pf with
| Ax _ _ _ => true
| OrIL _ _ _ pf => no_destruct pf
| OrIR _ _ _ pf => no_destruct pf
| OrE _ _ _ _ _ _ _ => false
| ImpliesI _ _ _ pf => no_destruct pf
| ImpliesE _ _ _ pf1 pf2 => no_destruct pf1 && no_destruct pf2
end.
您终于可以陈述您的元定理:任何可交换性证明都必须使用OrE
规则:
Theorem no_commutativity (pf : entails nil commutativity) : no_destruct pf = false.
在我的头上,我不确切知道该证明将如何进行。一种可能是给您的受限逻辑一个非标准的解释,该解释可以验证除OrE
之外的所有推理规则,并且Or
不可交换。