Isabelle/HOL 限制密码域
Isabelle/HOL restrict codomain
很抱歉最近问了伊莎贝尔这么多问题。现在我有一个类型问题。
我想使用 AFP 理论中介绍的 type_synonym。
type_synonym my_fun = "nat ⇒ real"
我在自己的理论中有一个地方:
fixes n :: nat
and f :: "my_fun"
and A :: "nat set"
defines A: "A ≡ {0..n}"
但是,在我的用例中,函数 f 的输出始终是集合 {0..n} 中的自然数。我想将此作为条件强加(或者有更好的方法吗?)。我找到的唯一方法是:
assumes "∀v. ∃ i. f v = i ∧ i ∈ A"
因为
assumes "∀v. f v ∈ A"
无效。
如果我让 Isabelle 向我展示所涉及的类型,我觉得还可以:
∀v::nat. ∃i::nat. (f::nat ⇒ real) v = real i ∧ i ∈ (A::nat set)
但是现在我当然不能输入这样的东西了:
have "f ` {0..10} ⊆ A"
但我必须证明这一点。我明白这个问题是从哪里来的。但是,我不知道如何处理这种情况。处理它的正常方法是什么?我想使用 my_fun 因为它与我的理论具有相同的含义。
谢谢你(再次)。
如果仔细查看 ∀v::nat. ∃i::nat. (f::nat ⇒ real) v = real i ∧ i ∈ (A::nat set)
,您将能够看到用于在 nat
和 real
之间进行隐式类型转换的机制:它是缩写real
(这会调用 Nat.thy 中为 semiring_1
定义的 of_nat
)出现在语言环境上下文中的假设语句中。
当然,您可以显式使用相同的机制。例如,您可以将 A::real set
定义为 A ≡ image real {0..n}
,而不是将 A::nat set
定义为 A ≡ {0..n}
。那么你可以使用 range f ⊆ A
而不是 assumes "∀v. ∃ i. f v = i ∧ i ∈ A”
。但是,我怀疑是否存在普遍接受的正确方法:这取决于您要实现的目标。尽管如此,为了便于讨论,您的语言环境可能如下所示:
type_synonym my_fun = "nat ⇒ real"
locale myloc_basis =
fixes n :: nat
abbreviation (in myloc_basis) A where "A ≡ image real {0..n}"
locale myloc = myloc_basis +
fixes f :: "my_fun"
assumes range: "range f ⊆ A"
lemma (in myloc) "f ` {0..10} ⊆ A"
using range by auto
I want to impose this as a condition (or is there a better way to do
it?).
答案取决于对 f
的了解。如果只知道 f
范围内的条件,正如您的问题陈述似乎暗示的那样,那么,我想,您只能说是假设。
作为旁注,据我所知,defines
被认为已过时,最好避免在语言环境规范中使用它:.
很抱歉最近问了伊莎贝尔这么多问题。现在我有一个类型问题。
我想使用 AFP 理论中介绍的 type_synonym。
type_synonym my_fun = "nat ⇒ real"
我在自己的理论中有一个地方:
fixes n :: nat
and f :: "my_fun"
and A :: "nat set"
defines A: "A ≡ {0..n}"
但是,在我的用例中,函数 f 的输出始终是集合 {0..n} 中的自然数。我想将此作为条件强加(或者有更好的方法吗?)。我找到的唯一方法是:
assumes "∀v. ∃ i. f v = i ∧ i ∈ A"
因为
assumes "∀v. f v ∈ A"
无效。
如果我让 Isabelle 向我展示所涉及的类型,我觉得还可以:
∀v::nat. ∃i::nat. (f::nat ⇒ real) v = real i ∧ i ∈ (A::nat set)
但是现在我当然不能输入这样的东西了:
have "f ` {0..10} ⊆ A"
但我必须证明这一点。我明白这个问题是从哪里来的。但是,我不知道如何处理这种情况。处理它的正常方法是什么?我想使用 my_fun 因为它与我的理论具有相同的含义。
谢谢你(再次)。
如果仔细查看 ∀v::nat. ∃i::nat. (f::nat ⇒ real) v = real i ∧ i ∈ (A::nat set)
,您将能够看到用于在 nat
和 real
之间进行隐式类型转换的机制:它是缩写real
(这会调用 Nat.thy 中为 semiring_1
定义的 of_nat
)出现在语言环境上下文中的假设语句中。
当然,您可以显式使用相同的机制。例如,您可以将 A::real set
定义为 A ≡ image real {0..n}
,而不是将 A::nat set
定义为 A ≡ {0..n}
。那么你可以使用 range f ⊆ A
而不是 assumes "∀v. ∃ i. f v = i ∧ i ∈ A”
。但是,我怀疑是否存在普遍接受的正确方法:这取决于您要实现的目标。尽管如此,为了便于讨论,您的语言环境可能如下所示:
type_synonym my_fun = "nat ⇒ real"
locale myloc_basis =
fixes n :: nat
abbreviation (in myloc_basis) A where "A ≡ image real {0..n}"
locale myloc = myloc_basis +
fixes f :: "my_fun"
assumes range: "range f ⊆ A"
lemma (in myloc) "f ` {0..10} ⊆ A"
using range by auto
I want to impose this as a condition (or is there a better way to do it?).
答案取决于对 f
的了解。如果只知道 f
范围内的条件,正如您的问题陈述似乎暗示的那样,那么,我想,您只能说是假设。
作为旁注,据我所知,defines
被认为已过时,最好避免在语言环境规范中使用它: