在Isabelle中需要一个定义来说明两个分部函数永远不会产生相同的输出

在Isabelle中需要一个定义来说明两个分部函数永远不会产生相同的输出,isabelle,theorem-proving,master-theorem,theorem,z-notation,Isabelle,Theorem Proving,Master Theorem,Theorem,Z Notation,我正在使用HOL-Z中的数学工具箱来释放一些Isabelle谓词。具体来说,我使用部分函数定义来定义我正在编写的Z规范中的一些关系,在这里我将模式的语句转换为规范语句,以便生成简单的HOL谓词 HOL-Z工具包中的定义 type_synonym ('a,'b) lts = "('a*'b) set" (infixr "<=>" 20) prodZ ::"['a set,'b set] => ('a <=> 'b) "

我正在使用HOL-Z中的数学工具箱来释放一些Isabelle谓词。具体来说,我使用部分函数定义来定义我正在编写的Z规范中的一些关系,在这里我将模式的语句转换为规范语句,以便生成简单的HOL谓词

HOL-Z工具包中的定义

type_synonym      ('a,'b) lts = "('a*'b) set"     (infixr "<=>" 20)

  prodZ       ::"['a set,'b set] => ('a <=> 'b) "        ("_ %x _"  [81,80] 80)
"a %x b"        == "a <*> b"

rel           ::"['a set, 'b set] => ('a <=> 'b) set"    ("_ <--> _"   [54,53] 53)
rel_def       : "A <--> B    == Pow (A %x B)"

partial_func  ::"['a set,'b set] => ('a <=> 'b) set"     ("_ -|-> _"   [54,53] 53)
partial_func_def  : "S -|-> R    == 
    {f. f:(S <--> R) & (! x y1 y2. (x,y1):f & (x,y2):f  --> (y1=y2))}"

rel_appl      :: "['a<=>'b,'a] => 'b"    ("_ %^ _"  [90,91] 90)
rel_appl_def  :  "R %^ x       == (@y. (x,y) : R)"
如果balance和Bbalance都是Isabelle中形式为('a'b')的部分函数(在Z中),我认为它的性能良好

我如何定义另一个函数,我说这两个部分函数对于所有的“x”是完全不相交的。我的意思是,在两个分部函数“balance”和“Bbalance”上应用相同的值,不会产生相同的值。类似于

FORALL x. balance %^ x \noteq Bbalance %^ x

对不起,解释得不好。我们通过专家建议学习:)。

您的rel_appl_def规则使用ε函数。根据斯坦福哲学百科全书(SEP)(*)在1921年(1922年)的汉堡演讲中,希尔伯特首先提出了使用选择函数处理形式算术系统中排除中间原则的想法

ε函数的支配公理如下:

 (A x) --> (A (@ A))
在古典逻辑中,由于ex falso quodlibet,如果(A x)失败,(@A)可以进行任何解释。这意味着您的rel_appl_def规则在提供不在域domr中的参数x时给出任何值

因此,您可能希望在两个分部函数上使用以下布尔函数(^)作为等式:

 f ^ g = (dom f = dom g) & (!x. x : dom f --> f %^ x = g %^ x)
当SEP写到第二个,可能是当前更感兴趣的问题时,我无法理解的是在定理证明系统HOL和Isabelle中使用epsilon算子,epsilon项的表达能力产生了显著的实际优势

我在实践中看到了对部分函数更简单的处理,即使用选项类型。因此,部分函数f只属于类型a=>B选项。但是,当您无法更改项目中的类型时,寻求符合您的需求的平等性可能是更明智的,上面的定义可能是一个候选

再见

(*)
ε演算,杰里米·阿维加德和理查德·扎克
2002年5月3日星期五首次出版;2013年11月27日星期三实质性修订

我刚刚注意到,伊莎贝尔很可能会允许你证明(f^g)(f=g),而伊莎贝尔也会给你(!x.x:f=x:g)(f=g)。但我认为(!x.(f%^x)=(g%^x))(f=g)的可能性不大。正如一个旁侧节点:较新版本的Isabelle也有“partial_function”指令,请参见此处:但我目前不知道底层机制,以及它是否包含进一步可行的替代方案。
 f ^ g = (dom f = dom g) & (!x. x : dom f --> f %^ x = g %^ x)