Coq 我怎样才能证明她不能证明或交换,只有介绍和应用?

Coq 我怎样才能证明她不能证明或交换,只有介绍和应用?,coq,Coq,这个问题与我在节假日调查的一个战略游戏(谈判、协议、加密等)设置有关,玩家是Coq用户 其中一些人的推理能力有限,例如,他们只能介绍和应用他们给出的假设或引理 其他一些人可能可以访问陶托 相反,一些理性玩家拥有无限的推理能力,并且知道其他玩家的类型。因此,理性的玩家可以思考其他玩家能证明什么或不能证明什么,并以此为基础为游戏中的下一步做出决定 非理性的玩家永远无法使用CIC条款。因此,我将他们的Ltac语法限制为一致但较小的片段。我还限制了他们的原子战术清单。例如,我不允许使用apply wit

这个问题与我在节假日调查的一个战略游戏(谈判、协议、加密等)设置有关,玩家是Coq用户

其中一些人的推理能力有限,例如,他们只能介绍和应用他们给出的假设或引理

其他一些人可能可以访问陶托

相反,一些理性玩家拥有无限的推理能力,并且知道其他玩家的类型。因此,理性的玩家可以思考其他玩家能证明什么或不能证明什么,并以此为基础为游戏中的下一步做出决定

非理性的玩家永远无法使用CIC条款。因此,我将他们的Ltac语法限制为一致但较小的片段。我还限制了他们的原子战术清单。例如,我不允许使用apply with patterns或其他打开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.
很明显,我们需要埃利姆,左右战术。介绍和应用是不够的

问题:我如何证明她不能证明或仅用介绍和应用交换

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.

为了说明这个定理,您需要定义一个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.
仅允许
介绍
应用
将等同于排除使用
,我们可以使用布尔谓词强制执行:

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 < /代码>,以及<代码>或< /代码>是不可交换的。

我所考虑的游戏所需的数学量实际上比支持逻辑更为复杂。我需要谓词逻辑和真实分析。例如,其中一个博弈是鲁宾斯坦讨价还价模型。这就是为什么我想尽可能接近战术/Ltac。我不知道我怎么能听从你的建议。尽管如此,我还是对你在交换性问题上的回答如此之快和如此之远感到惊讶。尽管更复杂,你也可以用这种方法形式化高阶逻辑。这就是Coq手册定义CIC的方式,例如()。我不知道有任何发展尝试通过策略形式化证明系统的语义,但我怀疑这将比形式化蕴涵关系更复杂。在任何情况下,您都需要在Coq中形式化一些证明系统,以说明可证明性;否则你将无法陈述你的结果。谢谢亚瑟。顺便说一句,包含项定义中的Ax构造函数有一个错误。我不确定包含项中的OrE构造函数。它不处理P在G中,但不在头部。我最好看一下:在pg->In Q G->includes G R->includes G(或pq)->includes(List.remove P(List.remove Q G))G R。但它也不能成功,因为我的道具类型不相等。@FZed通常,上面的证明系统会验证交换属性,也就是说,如果
蕴涵G P
是可导的,那么
蕴涵G'P
对于
G
的任何排列
G'
也是可导的。使用exchange,可以将您要查找的规则作为派生原则而不是原始原则来实现。