Isabelle 应用关于序列的公理
考虑以下基于Isabelle Sequents库的最小开发:Isabelle 应用关于序列的公理,isabelle,Isabelle,考虑以下基于Isabelle Sequents库的最小开发: theory Test imports Pure Sequents.Sequents begin syntax "_Trueprop" :: "two_seqe" ("((_)/ ⊢ (_))" [6,6] 5) consts Trueprop :: two_seqi parse_translation ‹[ (@{syntax_const "_Trueprop"}, K (two_seq_tr @{const_synt
theory Test
imports Pure Sequents.Sequents
begin
syntax "_Trueprop" :: "two_seqe" ("((_)/ ⊢ (_))" [6,6] 5)
consts Trueprop :: two_seqi
parse_translation ‹[ (@{syntax_const "_Trueprop"}, K (two_seq_tr @{const_syntax Trueprop})) ]›
print_translation ‹[ (@{const_syntax Trueprop}, K (two_seq_tr' @{syntax_const "_Trueprop"})) ]›
axiomatization where
identity : "$A, P, $B ⊢ $C, P, $D" and
xch : "$A, $B, $C, $D, $E ⊢ $F ⟹ $A, $D, $C, $B, $E ⊢ $F"
lemma xch0 : "$A, $B, $D, $E ⊢ $F ⟹ $A, $D, $B, $E ⊢ $F"
apply (rule xch ; assumption) done
lemma xch1 : "$A, $B, P, $D, $E ⊢ $F ⟹ $A, $D, P, $B, $E ⊢ $F"
apply (rule xch ; assumption) done
lemma xch2 : "$A, $B, P1, P2, $D, $E ⊢ $F ⟹ $A, $D, P1, P2, $B, $E ⊢ $F"
apply (rule xch ; assumption) done
引理的尝试证明失败了。但是,如果我删除标识
公理,它们就会成功!所以我的第一个问题是,identity
公理的存在为什么会影响这些不使用它的证明
我的主要问题是,当我有恒等式公理时,如何使这些证明有效。我的猜测是,我需要显式地专门化变量,例如通过应用xch[of A B_udef]
。这似乎是正确的专门化(它在没有标识的情况下工作),但它给出了一个非常奇怪的错误
Failed to meet type constraint:
Term A :: 'a => seq'
Type seq' => seq'
我是否需要写一些明确的东西来代替\uu
?如果是,什么?我不知道如何显式地写“空序列”或“仅包含P
的序列”或“仅包含P1、P2
的序列”-$A
符号的神奇性让我无法理解
编辑:Andreas对我的第一个问题的回答完全解决了我的实际问题,因此我将此问题重命名并接受该答案。但是我仍然想知道我的第二个问题的答案,所以我要单独提问。变量显式实例化的错误消息已经表明类型有问题。问题是,公理化
同时调用所有公理的类型推理。由于identity
axiom使用了与xch
axiom相同的变量名A
,因此类型推断为它们分配了相同的类型。如果恒等式
公理不存在,则类型推理会计算一个更一般的类型,从而使证明有效。因此,有两种方法可以避免此问题:
在公理化
块中提到的所有公理中使用不同的变量名。这确实有效,但通常会降低可读性,并且容易忽略某些内容
通过使用Pure的元量词显式量化公理中的自由变量,避免它们
在您的示例中,方法2如下所示:
axiomatization where
identity : "⋀A P B C D. $A, P, $B ⊢ $C, P, $D" and
xch : "⋀A B C D E F. $A, $B, $C, $D, $E ⊢ $F ⟹ $A, $D, $C, $B, $E ⊢ $F"
谢谢我不知道那个警告信息是什么意思。从现在起,我一定会用你的第二种方法来做,这显然是正确的方法。然而,我想更好地了解出了什么问题。我确实意识到,在公理化
中出现的所有相同(未绑定)变量都具有相同的类型,但我没有想到这可能是问题所在,因为直觉上,在这两个公理中,A
具有相同的类型,即“命题列表”。想必这与序列理论的魔法$
-的实现有关;你能解释一下吗?还有,为什么所有使用序列的理论都没有明确的元量词?就像和一样。是的,这都是关于$
-魔法的。如果sequent语句中的所有变量都使用$
,则类型推断将为变量生成更通用的类型,即'a=>'a
,而不是seq=>seq
。因此,除了使你的公理更一般化之外,你还可以通过明确声明变量的类型,使引理中的类型更专业化,例如,使用表示bdef::seq=>seq
,您将看到,没有一个引理只使用$
-ized变量。因此,它们从未遇到多态性问题。这表明您的xch
公理可能实际上过于笼统。