推理 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

当你想证明一个归纳谓词成立时,你只需要使用它的引入规则;当您想证明归纳谓词暗示其他东西时,您可以使用归纳及其归纳规则。

对于余归谓词,它通常是相反的:当你想证明一个余归谓词暗示其他东西时,你只需使用它的消除规则。当你想证明一个余归纳谓词成立时,你必须使用余归纳。