推理 Isabelle/HOL 中的整个 codatatype
Reasoning about the entirety of a codatatype in Isabelle/HOL
我想写下一些关于图中路径的定义(并证明一些引理!)。假设该图是由 'a => 'a => bool
类型的关系隐式给出的。要谈论图中可能的无限路径,我认为明智的做法是使用像 'a llist
这样的惰性列表协同数据类型,如“Defining (Co)datatypes and Primitively (Co)recursive Functions在 Isabelle/HOL"(datatypes.pdf
在 Isabelle 分布中)。
这工作得很好,但我想定义一个谓词,它接受这样一个列表和一个图形关系,并评估为真当且仅当该列表定义了图形中的有效路径:任何一对列表中的相邻条目必须是一条边。
如果我使用 'a list
作为表示路径的类型,这将很简单:我只需使用 primrec
定义谓词。然而,我能找到的共同归纳定义似乎都是一次生成或使用一个元素的数据,而不是能够对整个事物做出陈述。显然,我意识到生成的谓词将无法计算(因为它是关于无限流的陈述),所以它可能在某处有一个 \forall ,但这很好 - 我想用它来发展一个理论,不生成代码。
如何定义这样的谓词? (我如何证明明显相关的引入和消除引理使其有用?)
谢谢!
我想最惯用的方法是使用余归谓词。直觉上,这就像一个普通的归纳谓词,只是你还允许“无限推导树”:
type_synonym 'a graph = "'a ⇒ 'a ⇒ bool"
codatatype 'a llist = LNil | LCons 'a "'a llist"
coinductive is_path :: "'a graph ⇒ 'a llist ⇒ bool" for g :: "'a graph" where
is_path_LNil:
"is_path g LNil"
| is_path_singleton:
"is_path g (LCons x LNil)"
| is_path_LCons:
"g x y ⟹ is_path g (LCons y path) ⟹ is_path g (LCons x (LCons y path))"
这为您提供了介绍规则 is_path.intros
和淘汰规则 is_path.cases
。
当你想证明一个归纳谓词成立时,你只需要使用它的引入规则;当您想证明归纳谓词暗示其他东西时,您可以使用归纳及其归纳规则。
对于余归谓词,它通常是相反的:当你想证明一个余归谓词暗示其他东西时,你只需使用它的消除规则。当你想证明一个余归纳谓词成立时,你必须使用余归纳。
我想写下一些关于图中路径的定义(并证明一些引理!)。假设该图是由 'a => 'a => bool
类型的关系隐式给出的。要谈论图中可能的无限路径,我认为明智的做法是使用像 'a llist
这样的惰性列表协同数据类型,如“Defining (Co)datatypes and Primitively (Co)recursive Functions在 Isabelle/HOL"(datatypes.pdf
在 Isabelle 分布中)。
这工作得很好,但我想定义一个谓词,它接受这样一个列表和一个图形关系,并评估为真当且仅当该列表定义了图形中的有效路径:任何一对列表中的相邻条目必须是一条边。
如果我使用 'a list
作为表示路径的类型,这将很简单:我只需使用 primrec
定义谓词。然而,我能找到的共同归纳定义似乎都是一次生成或使用一个元素的数据,而不是能够对整个事物做出陈述。显然,我意识到生成的谓词将无法计算(因为它是关于无限流的陈述),所以它可能在某处有一个 \forall ,但这很好 - 我想用它来发展一个理论,不生成代码。
如何定义这样的谓词? (我如何证明明显相关的引入和消除引理使其有用?)
谢谢!
我想最惯用的方法是使用余归谓词。直觉上,这就像一个普通的归纳谓词,只是你还允许“无限推导树”:
type_synonym 'a graph = "'a ⇒ 'a ⇒ bool"
codatatype 'a llist = LNil | LCons 'a "'a llist"
coinductive is_path :: "'a graph ⇒ 'a llist ⇒ bool" for g :: "'a graph" where
is_path_LNil:
"is_path g LNil"
| is_path_singleton:
"is_path g (LCons x LNil)"
| is_path_LCons:
"g x y ⟹ is_path g (LCons y path) ⟹ is_path g (LCons x (LCons y path))"
这为您提供了介绍规则 is_path.intros
和淘汰规则 is_path.cases
。
当你想证明一个归纳谓词成立时,你只需要使用它的引入规则;当您想证明归纳谓词暗示其他东西时,您可以使用归纳及其归纳规则。
对于余归谓词,它通常是相反的:当你想证明一个余归谓词暗示其他东西时,你只需使用它的消除规则。当你想证明一个余归纳谓词成立时,你必须使用余归纳。