关于Isabelle / HOL中整个codatatype的推理

时间:2018-03-21 09:22:20

标签: isabelle corecursion

我想写一些关于图中路径的定义(并证明一些引理!)。假设图形由'a => 'a => bool类型的关系隐式给出。为了讨论图中可能无限的路径,我认为一个明智的事情就是使用像{em>定义(Co)数据类型和Isabelle中的原始(Co)递归函数中给出的'a llist之类的惰性列表类型。 / HOL “(Isabelle分布中的datatypes.pdf)。

这很好用,但是我想要定义一个带有这样一个列表和图形关系的谓词,如果列表在图中定义了一个有效路径,则求值为true:任何一对相邻的条目在列表中必须是边缘。

如果我使用'a list作为表示路径的类型,这很容易:我只使用primrec定义谓词。但是,我发现的共同归纳定义似乎都是一次生成或消耗一个元素的数据,而不是能够对整个事物做出声明。显然,我意识到结果谓词不会是可计算的(因为它是关于无限流的声明),所以它可能在那里有一个\ forall,但这没关系 - 我想用它来开发一个理论,没有生成代码。

如何定义这样的谓词? (我怎样才能证明明显相关的引入和消除引理使其有用?)

谢谢!

1 个答案:

答案 0 :(得分:3)

我认为最常用的方法是使用coinductive谓词。直觉上,这就像一个正常的归纳谓词,除了你还允许'无限推导树':

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

当你想表明归纳谓词成立时,你只需使用它的引入规则;当你想表明归纳谓词暗示其他东西时,你会使用归纳法及其归纳规则。

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