Isabelle 应用关于序列的公理

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

考虑以下基于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_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
    公理可能实际上过于笼统。