我有点惊讶
value "let x = SOME n. n ∈ {1::int,2} in x = x"
返回True
。在β-扩展和α-重命名之后,该术语与以下相同:
value "(SOME na. na ∈ {1::int,2}) = (SOME nb. nb ∈ {1::int,2})"
我不明白为什么这种平等应该成立。为什么na
选择的值与为nb
选择的值相同?
答案 0 :(得分:6)
左侧的术语与右侧的术语完全相同(模数转换)。因此,它们也具有相同的价值。等于(或更确切地说是等同于α)的术语总是在HOL中产生相等的值,因为它是确定性的。
你可以认为SOME x. P x
给你一个任意但固定的值,属性P
成立(如果这样的值存在,否则只是一些任意但固定的值你对此一无所知所有)。特别是,具有相同参数的SOME的不同“调用”将始终为您提供相同的值。 THE
,undefined
等也是如此。
如果你想要真正的非确定性选择,你必须在HOL中使用不同的逻辑或模型非确定性。精化框架提供了一个不确定的monad,其中每个操作都可以有零个,一个或多个可能的结果。