在这里,我要求提供Isabelle元逻辑连词消除规则的证明。
以下来源包含我的评论,这些评论解释了我正在做的一些事情。在理论上,有两对元假定义和连词消除规则。这两对是:
falseH
,andH_E1
和falseM
,andM_E1
。我的andM
连词的格式是(P ==> Q ==> falseM) ==> falseM)
,而这个格式我无法轻易证明。
将来,我计划使用元逻辑运算符复制HOL.thy自然演绎规则,这与上面的andM
类似。作为其中的一部分,运算符==>
将被视为原始运算符。因为Pure运算符!!
在与==>
相同的意义上也是原始运算符,所以我猜测我可能无法开发有助于我使用元错误定义的规则!!P. PROP P
{1}},我在下面使用它。不过我可能错了。
我不得不在下面尝试使用falseM
,因为falseH
有助于已经与HOL一起使用的simp
魔法,双关语并不打算。虽然我不必拥有它,但拥有它会很好。
theory i131210a__SO_question_andM_elim
imports Complex_Main
begin
(*This is conjunct1 from HOL.thy, line 426. Someday, I'll get rules to
use by duplicating the HOL rules as meta-logic rules, but my question
here is about proving andM_E1 below with what's already available.*)
lemma conjunct1_from_HOL:
"[| P & Q |] ==> P"
by(unfold and_def, iprover intro: impI dest: spec mp)
(*Using bool for falseH allows the auto magic to work for andH_E1.*)
definition falseH :: "prop" ("falseH") where
"falseH == (!!P. P::bool)"
theorem andH_E1:
"((P ==> Q ==> falseH) ==> falseH) ==> P"
by(unfold falseH_def, auto)
(*Using Pure &&&, auto-tools work too, but I want a different meta-and.*)
theorem mand_E1:
"(P &&& Q) ==> P"
by(linarith)
(*Here I define a pure meta-false. That's what I want, if I can get it.*)
definition falseM :: "prop" ("falseM") where
"falseM == (!!P. PROP P)"
(*But here, I need an IsaMagician to do what may be easy, or may be hard.
A proof for this might give me a good template to follow.*)
theorem andM_E1:
"((P ==> Q ==> falseM) ==> falseM) ==> P"
apply(unfold falseM_def)
oops
end
我用三件事来更新它,其中两件与Andreas'相关。回答需要排除中间的公理。我在下面所说的并不是对任何事情的真正答案,并且它可以接受更多评论,因为我在简单的事情上可能是错的。
我在这里提出了冗长的意见,以巩固与我的问题的核心思想相关的一些想法,即如何使用元逻辑假来定义元逻辑运算符。
P or not P
,这是具有欺骗性的,因为我很少考虑被排斥的中间人,因为它根深蒂固了我的想法。"(P &&& Q) ==> P
中的conjunctionD1
证明了conjunction.ML
,并且使用meta_allE
证明了展开的版本。我想知道为什么andM
在内部而非外部!!
不能被操纵,以便可以证明它。所以Adreas救了我好几个月,可能至少一年,并且可能多年没有结果的计划,指出Isabelle / Pure没有被排除在外的中间,我需要它。这有助于回答我的相关问题,并帮助我更有意义地了解Isabelle / Pure是什么。
如果强制使用HOL排除中间人,我只会使用False
,而不是(!!P. P::bool)
。
如果我想要一个meta-false,我想我会在这样的语言环境中添加一个排除元逻辑的元逻辑:
abbreviation (input) trueM :: "prop" ("trueM") where
"trueM == (falseM ==> falseM)"
locale pure_with_em =
assumes t_or_f: "((P == trueM) ==> falseM) ==> (P == falseM)"
begin
theorem andM_E1:
"((P ==> Q ==> falseM) ==> falseM) ==> P"
unfolding falseM_def
oops
end
就像我说的那样,这不是一个答案,因为我必须解决这个问题。
根据Andreas提供的证据,HOL中有classical
:
lemma classical:
assumes prem: "~P ==> P" shows "P"
apply (rule True_or_False [THEN disjE, THEN eqTrueE])
...
像这样的HOL定理的证明步骤告诉我对元逻辑版本的需求。我通过提供语言环境t_or_f
来完成简单的部分。其余的只是简单的工作。
在这里,我不是仅仅谈论谈话,我有时会这样做,但是我把我所做的工作放在了==
作为排除中间人的一部分。我可能需要再次查看这一切,所以也许它不会被反对我。
首先,跳过我接下来关于HOL引理excluded_middle
的说法,一个人,尤其是我,也想要考虑这个问题。
HOL.thy
公理,第171行:
True_or_False: "(P = True) | (P = False)".
安德烈亚斯指出,需要排除中间的法则,并且Pure不提供它。这是名为HOL.thy
的定理
excluded_middle
,第604行:
lemma excluded_middle: "~P | P" by (iprover intro: disjCI)
类似地,我将此声明为使用falseM
的元逻辑定理,其中我的meta或者是(P ==> falseM) ==> Q
,而meta-not是P ==> falseM
。
theorem
"(P ==> falseM) ==> (P ==> falseM)"
by(simp)
如果定义元或符号来模糊它实际上是什么,逻辑新手(当然不是我)可能不会将其识别为"如果P为假,则P为假"而不是& #39; s需要,"如果P不是假,那么它必须是真的"。
更新(131213):我把它放进去因为我可以忘记为什么我做了一些事情,然后当我试图回过头来时,我觉得我搞砸了大部分时间,当时我没有,尽管我逻辑意识可能还没有完成。
我实际上并未实现
~P | P
的元逻辑版本,而是P | ~P
。如果它不是很明显,它可能是,我使用基于真值表的暗示定义以及DeMorgan的定律,并使用逻辑的基本定理,最终必须是真的我然而,我现在正在研究排除中间词的公理,这使得我使用
P | ~P
不太可接受的事实,因为它变成"((P ==> falseM) ==> falseM) ==> P"
,这涉及到双否定,我依旧记得与这一切有关。直到现在,我从未在我的生活中不得不关注被排除在外的中间人。这应该是建构主义者的想法。我做出转换实际上是偶然的,因为这让我看到
=
中True_or_False
的重要性。
一个有意义的定理是"不是(P而不是P)" (或者会吗?)
因此,我在元数据和表达式中将(P ==> falseM)
替换为Q
(P ==> Q ==> falseM) ==> falseM
。
theorem
"((P ==> (P ==> falseM) ==> falseM) ==> falseM) ==> falseM"
by(auto,assumption)
这已经完全发挥了逻辑 - 傻瓜红色警报,因为falseM
没有必要扩大。现在,我陈述相同的定理,但没有
bool
变量而没有falseM
,以明确表示它没有任何内容
与falseM
或bool
。
theorem
"((PROP P ==> (PROP P ==> PROP Q) ==> PROP Q) ==> PROP Q) ==> PROP Q"
by(erule Pure.cut_rl Pure.meta_impE Pure.meta_mp, assumption)
回到我开头跳到的地方,我现在看到一把钥匙
区别在于=
中正在使用运算符True_or_False
。
现在,我说明True_or_False
使用运算符==
的元逻辑形式,
使用meta或(P ==> falseM) ==> Q
,真实部分为(P == (falseM ==> falseM))
,虚假部分为(P == falseM)
。
theorem
"((P == (falseM ==> falseM)) ==> falseM) ==> (P == falseM)"
apply(unfold falseM_def)
oops
这最终让我得到了一个有意义的被排除的元逻辑陈述
中间,falseM
需要扩展。我无法证明这一点,哪个
本身没有任何意义,或反驳它,这意味着我可以完全
困惑。
这说明了为什么我必须研究很多低级逻辑才能工作 当我的最终目标是高级数学时,与定理助手一起, 传统上并不需要这种知识。
没有很好地理解没有排除中间人的意义 最终杀了我,等等。
"(P &&& Q) ==> P"
可以在上面证明? (P &&& Q) ==> P
可以证明具有重要意义
上面的方法linarith
和presburger
,&&&
中的pure_thy.ML
就是这样:
"(A &&& B) == (!!C::prop. (A ==> B ==> C) ==> C)"
我的meta和使用falseM
实际上只是移动!!
的使用
在falseM
扩展后,从外到内。
在这里,我证明了扩展的元和消除术语,并使用Pure.conjunctiond1
证明了它的未扩展版本。
theorem
"(PROP P &&& PROP Q) ==> PROP P"
apply(unfold Pure.conjunction_def)
by(erule Pure.meta_allE, assumption)
theorem expanded_and_1:
"(!!R. (PROP P ==> PROP Q ==> PROP R) ==> PROP R) ==> PROP P"
by(erule Pure.meta_allE, assumption)
theorem
"(PROP P &&& PROP Q) ==> PROP P"
by(erule Pure.conjunctionD1)
规则conjunctionD1
位于conjunction.ML
,似乎forall_elim_vars
正在处理运算符!!
,我认为它与meta_allE
正在做同样的事情。
我比较了连词消除规则的两个扩展版本。第一个词使用标准&&&
,第二个词使用我的andM
。
term "(!!R. (P ==> Q ==> PROP R) ==> PROP R) ==> P"
term "((P ==> Q ==> (!!P. PROP P)) ==> (!!P. PROP P)) ==> P"
使用&&&
可以使用meta_allE
轻松证明第一个字词,如上所示。
在我看来,我应该能够将第二个词操纵到第一个词的形式,但我不会知道。如果这是真的,那么我不需要为这个定理添加排除中间的公理。我在学习了很多自然演绎之后就知道了,就像我需要的那样。
如果我的目标只是元逻辑运算符,我会使用&&&
,但这不是我的目标。我的目标是定义一个meta-false用于缩写元逻辑运算符。我试图略微扩展Isabelle / Pure的自然演绎框架,而不是重复所有HOL。
我从这个问题得到的主要价值是,我现在知道我需要注意是否需要排除中间人的公理。如果我想要一个错误的假,那么我似乎需要一个排除中间的公理。
这是我离开的地方。感谢您的帮助,请原谅冗长的补充。
答案 0 :(得分:1)
作为第一步,您可以在不使用任何校对工具的情况下证明HOL版本andH_E1
,只需普通rule
,subst
和assumption
。然后,您应该能够看到是否可以将证明转换为andM_E1
以及如何将其转换为andH_E1
。我找到了theorem andH_E1: "((P ==> Q ==> falseH) ==> falseH) ==> P"
unfolding falseH_def
apply(rule classical)
apply(erule meta_allE)
apply(erule meta_impE)
apply(erule notE)
apply assumption
apply assumption
done
的以下证据:
classical
如您所见,第一步应用规则andM_E1
,即我的证明仅适用于经典逻辑。然而,Pure比经典逻辑弱,因为没有排除中间的公理。因此,您将无法将此证明转移到andH_E1
。您可以尝试找到不依赖于经典公理的iprover
证明,但我怀疑您会找到一个;至少_ ==> falseM
没有。否则,除非你将被排除的中间公理引入Pure,否则你无法用纯粹的方法来证明这个定理。
由于被排除的中间等同于经典公理(你可以从另一个得到它),最简单的方法可能是直接添加经典公理,例如,如你所建议的那样在一个语言环境中。然后,证据如下,我将纯粹的否定写为locale classical =
assumes pure_classical: "((PROP P ==> falseM) ==> PROP P) ==> PROP P"
begin
theorem andM_E1:
"((PROP P ==> PROP Q ==> falseM) ==> falseM) ==> PROP P"
unfolding falseM_def
apply(rule pure_classical)
apply(erule meta_allE)
apply(erule meta_impE) back
apply(erule (1) meta_impE)
apply(unfold falseM_def)
apply(assumption)
apply(assumption)
done
end
。
{{1}}