我想写一些关于图中路径的定义(并证明一些引理!)。假设图形由'a => 'a => bool
类型的关系隐式给出。为了讨论图中可能无限的路径,我认为一个明智的事情就是使用像{em>定义(Co)数据类型和Isabelle中的原始(Co)递归函数中给出的'a llist
之类的惰性列表类型。 / HOL “(Isabelle分布中的datatypes.pdf
)。
这很好用,但是我想要定义一个带有这样一个列表和图形关系的谓词,如果列表在图中定义了一个有效路径,则求值为true:任何一对相邻的条目在列表中必须是边缘。
如果我使用'a list
作为表示路径的类型,这很容易:我只使用primrec
定义谓词。但是,我发现的共同归纳定义似乎都是一次生成或消耗一个元素的数据,而不是能够对整个事物做出声明。显然,我意识到结果谓词不会是可计算的(因为它是关于无限流的声明),所以它可能在那里有一个\ forall,但这没关系 - 我想用它来开发一个理论,没有生成代码。
如何定义这样的谓词? (我怎样才能证明明显相关的引入和消除引理使其有用?)
谢谢!
答案 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。