我怎么能证明她不能仅凭介绍和申请就可以证明Or_commutative?

时间:2018-08-16 06:57:56

标签: coq

这个问题与我在假期期间以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.

1 个答案:

答案 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.

仅允许introsapply等于排除对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不可交换。