我有一个conat
的定义,它可以表示有限值和无穷大值,从nat
的转换,一个无穷大的定义以及一个双仿真关系:
CoInductive conat : Set := O' | S' (n : conat).
Fixpoint toCo (n : nat) : conat := match n with
| O => O'
| S n' => S' (toCo n') end.
CoFixpoint inf : conat := S' inf.
CoInductive bisim : conat -> conat -> Prop :=
| OO : bisim O' O'
| SS : forall n m : conat, bisim n m -> bisim (S' n) (S' m).
Notation "x == y" := (bisim x y) (at level 70).
我想证明conat
是有限的还是无限的(我不能百分百确定这是正确的公式):
(* This is the goal *)
Theorem fin_or_inf : forall n : conat, (exists m : nat, toCo m == n) \/ (n == inf).
到目前为止,我还不能证明这一点,但是我可以证明另一种说法,即如果conat
不是有限的,那么它就是无限的(同样,对于公式,并非100%肯定):
(* I have a proof for this *)
Theorem not_fin_then_inf : forall n : conat, ~ (exists m : nat, toCo m == n) -> (n == inf).
我不知道如何从not_fin_then_inf
到fin_or_inf
。
我对fin_or_inf
的定义正确吗?
我是否可以使用fin_or_inf
来证明not_fin_then_inf
?
此外,我发现弥合两个定理之间的鸿沟涉及双模拟(或其扩展)的可判定性。我认为可判定性定理可以表示为
Lemma bisim_dec : forall n m : conat, n == m \/ ~ (n == m).
bisim_dec
或任何类似的关于双模拟的陈述吗? 证明“有限或无限”的原始动机是证明coplus
的可交换性和可结合性:
CoFixpoint coplus (n m : conat) := match n with
| O' => m
| S' n' => S' (coplus n' m)
end.
Notation "x ~+ y" := (coplus x y) (at level 50, left associativity).
Theorem coplus_comm : forall n m, n ~+ m == m ~+ n.
Theorem coplus_assoc : forall n m p, n ~+ m ~+ p == n ~+ (m ~+ p).
无法通过与nat
的{{1}}相同的方式进行操作,因为它要求+
的可传递性和类似于==
的引理,这会导致cofix调用无人看守。否则,我必须同时破坏plus_n_Sm
和n
,然后我将目标定为m
。
如果我选择n ~+ S' m == m ~+ S' n
的替代定义:
coplus
然后CoFixpoint coplus (n m : conat) := match n, m with
| O', O' => O'
| O', S' m' => S' m'
| S' n', O' => S' n'
| S' n', S' m' => S' (S' (coplus n' m'))
end.
很简单,但是coplus_comm
变得几乎不可能证明。
coplus_assoc
的第一个定义来证明coplus_comm
,还是用第二个定义来证明coplus
?