更改类型参数时,字段更新不起作用

时间:2014-03-30 20:37:41

标签: record isabelle

我发现record ⦇ field := value ⦈符号在我用它来改变过程中record的类型参数时,没有按预期工作。为了澄清我的意思,请考虑以下示例:

theory Scratch imports 
  Main 
begin

record 'a john =
  apple :: 'a
  banana :: int

definition f :: "nat john ⇒ bool john"
where
  "f j ≡ j ⦇ apple := True ⦈"

definition f_fixed :: "nat john ⇒ bool john"
where
  "f_fixed j ≡ ⦇ apple = True, banana = banana j ⦈"

end

由于类型错误,不接受f的定义。似乎我不能使用字段更新来更改基础记录的类型。我对此感到有些惊讶,因为f_fixed看起来非常相似,但工作得非常好。我做错了什么,或者这是一个已知的限制?

1 个答案:

答案 0 :(得分:2)

这是一个已知的限制。

语法j⦇ apple := True ⦈john.apple_update (λ_. True) j的简写,其中函数apply_update的类型为:

('a ⇒ 'a) ⇒ 'a john ⇒ 'a john

(第一个参数是一个传递旧值apple的函数并返回一个新值。因为你无条件地将字段更新为True,你的函数是(λ_. True) 。)

此功能的类型可防止类型'a在更新期间发生变化。您可能正在寻找的是具有以下类型的更新功能:

('a ⇒ 'b) ⇒ 'a john ⇒ 'b john

发布此类功能的一个可能的复杂因素是以下情况:

record 'a john =
  apple :: 'a
  banana :: 'a

apple_update的类型应该是什么?如果不同时更改apple的类型,则无法更改banana的类型。

同样,没有技术理由为什么记录包无法发出这样的函数,只需要确定在各个角落发出的正确函数是什么例。