Coq 我怎样才能证明她不能证明或交换,只有介绍和应用?
这个问题与我在节假日调查的一个战略游戏(谈判、协议、加密等)设置有关,玩家是Coq用户 其中一些人的推理能力有限,例如,他们只能介绍和应用他们给出的假设或引理 其他一些人可能可以访问陶托 相反,一些理性玩家拥有无限的推理能力,并且知道其他玩家的类型。因此,理性的玩家可以思考其他玩家能证明什么或不能证明什么,并以此为基础为游戏中的下一步做出决定 非理性的玩家永远无法使用CIC条款。因此,我将他们的Ltac语法限制为一致但较小的片段。我还限制了他们的原子战术清单。例如,我不允许使用apply with patterns或其他打开CIC条款大门的变体 在这个问题中,它只是一个由一个点分隔的香草式介绍和应用策略的有限序列 总之,玩家的类型由Ltac语法子集、原子战术列表和游戏开始时给出的一包引理定义 以下是重言式最详细(最小步骤)的证明:Coq 我怎样才能证明她不能证明或交换,只有介绍和应用?,coq,Coq,这个问题与我在节假日调查的一个战略游戏(谈判、协议、加密等)设置有关,玩家是Coq用户 其中一些人的推理能力有限,例如,他们只能介绍和应用他们给出的假设或引理 其他一些人可能可以访问陶托 相反,一些理性玩家拥有无限的推理能力,并且知道其他玩家的类型。因此,理性的玩家可以思考其他玩家能证明什么或不能证明什么,并以此为基础为游戏中的下一步做出决定 非理性的玩家永远无法使用CIC条款。因此,我将他们的Ltac语法限制为一致但较小的片段。我还限制了他们的原子战术清单。例如,我不允许使用apply wit
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,可以将您要查找的规则作为派生原则而不是原始原则来实现。