Isabelle技术问询:如何统一当前与导入locale的类型变量?
解决Isabelle Locale继承时类型变量不一致的问题
嘿,这个问题我之前也踩过坑!本质是Isabelle处理locale继承时,默认会给父locale生成全新的匿名类型变量,而非复用子locale里的同名类型变量——所以你写的x里的'a和y里的'a看起来同名,实际是完全独立的两个类型,这才导致g ∘ f出现类型不匹配的错误。
两种可行的解决方案:
方案1:显式绑定父locale的类型参数
在继承x时,明确告诉Isabelle要使用子localey的'a作为x的类型参数,写法如下:
locale x = fixes f :: "'a ⇒ 'a" assumes "f ∘ f = f" locale y = x('a) + fixes g :: "'a ⇒ 'b" begin abbreviation h :: "'a ⇒ 'b" where "h ≡ g ∘ f" end
这里的x('a)是核心:它把父localex的类型参数直接绑定到y的'a上,让两者的'a完全一致,这样f的返回类型和g的参数类型就能完美匹配。
方案2:显式声明子locale的类型变量
通过for关键字明确声明y的类型变量,Isabelle会自动将父localex的类型参数关联到y的同名类型变量上:
locale x = fixes f :: "'a ⇒ 'a" assumes "f ∘ f = f" locale y = x + fixes g :: "'a ⇒ 'b" for 'a 'b begin abbreviation h :: "'a ⇒ 'b" where "h ≡ g ∘ f" end
for 'a 'b相当于给y的类型变量“打标签”,继承x时Isabelle会自动把x的'a和y的'a绑定,从根源避免类型不匹配。
原代码失败的原因
原代码里的locale y = x + fixes g :: "'a ⇒ 'b"中,Isabelle会为x创建一个独立的匿名类型变量(比如'a_x),而y里的'a是另一个全新的类型变量。这就导致f的类型是'a_x ⇒ 'a_x,g的类型是'a ⇒ 'b,两者没有任何约束关系,自然无法合成g ∘ f。
内容的提问来源于stack exchange,提问作者Wolfgang Jeltsch
相关产品推荐
相关产品推荐

