Welcome to Abella 2.0.2-lf
Abella < Specification "lc_diverge.elf".
Reading specification "lc_diverge.elf"
sig lc_diverge.
type tm lftype.
type app lfobj -> lfobj -> lfobj.
type abs (lfobj -> lfobj) -> lfobj.
type eval lfobj -> lfobj -> lftype.
type eval/app lfobj -> lfobj -> (lfobj -> lfobj) -> lfobj -> lfobj -> lfobj -> lfobj.
type eval/abs (lfobj -> lfobj) -> lfobj.
end.
module lc_diverge.
(* tm:type *)
lfisty tm.
(* app:tm -> tm -> tm *)
pi lf_1\lfhas lf_1 tm => pi lf_2\lfhas lf_2 tm => lfhas (app lf_1 lf_2) tm.
(* abs:(tm -> tm) -> tm *)
pi lf_1\(pi lf_2\lfhas lf_2 tm => lfhas (lf_1 lf_2) tm) =>
lfhas (abs lf_1) tm.
(* eval:tm -> tm -> type *)
pi lf_1\lfhas lf_1 tm => pi lf_2\lfhas lf_2 tm => lfisty (eval lf_1 lf_2).
(* eval/app:{M:tm} {N:tm} {R:tm -> tm} {V:tm} eval M (abs R) ->
eval (R N) V -> eval (app M N) V *)
pi M\lfhas M tm =>
pi N\lfhas N tm =>
pi R\(pi lf_1\lfhas lf_1 tm => lfhas (R lf_1) tm) =>
pi V\lfhas V tm =>
pi lf_1\lfhas lf_1 (eval M (abs R)) =>
pi lf_2\lfhas lf_2 (eval (R N) V) =>
lfhas (eval/app M N R V lf_1 lf_2) (eval (app M N) V).
(* eval/abs:{R:tm -> tm} eval (abs R) (abs R) *)
pi R\(pi lf_1\lfhas lf_1 tm => lfhas (R lf_1) tm) =>
lfhas (eval/abs R) (eval (abs R) (abs R)).
end.
Abella < CoDefine diverge : lfobj -> prop by
diverge (app M N) := diverge M \/
(exists R P, <R:tm -> tm> /\ <P:eval M (abs R)> /\ diverge (R N)).
Abella < Theorem omega_diverge :
diverge (app (abs (x\app x x)) (abs (x\app x x))).
============================
diverge (app (abs (x\app x x)) (abs (x\app x x)))
omega_diverge < coinduction.
CH : diverge (app (abs (x\app x x)) (abs (x\app x x))) +
============================
diverge (app (abs (x\app x x)) (abs (x\app x x))) #
omega_diverge < unfold.
CH : diverge (app (abs (x\app x x)) (abs (x\app x x))) +
============================
diverge (abs (x\app x x)) + \/
(exists R P, <n1:tm |- R n1:tm> /\ <P:eval (abs ([x] app x x)) (abs R)> /\
diverge (R (abs (x\app x x))) +)
omega_diverge < right.
CH : diverge (app (abs (x\app x x)) (abs (x\app x x))) +
============================
exists R P, <n1:tm |- R n1:tm> /\ <P:eval (abs ([x] app x x)) (abs R)> /\
diverge (R (abs (x\app x x))) +
omega_diverge < exists x\app x x.
CH : diverge (app (abs (x\app x x)) (abs (x\app x x))) +
============================
exists P, <n1:tm |- app n1 n1:tm> /\
<P:eval (abs ([x] app x x)) (abs ([x] app x x))> /\
diverge (app (abs (x\app x x)) (abs (x\app x x))) +
omega_diverge < exists eval/abs (x\app x x).
CH : diverge (app (abs (x\app x x)) (abs (x\app x x))) +
============================
<n1:tm |- app n1 n1:tm> /\
<eval/abs ([x] app x x):eval (abs ([x] app x x)) (abs ([x] app x x))> /\
diverge (app (abs (x\app x x)) (abs (x\app x x))) +
omega_diverge < split.
Subgoal 1:
CH : diverge (app (abs (x\app x x)) (abs (x\app x x))) +
============================
<n1:tm |- app n1 n1:tm>
Subgoal 2 is:
<eval/abs ([x] app x x):eval (abs ([x] app x x)) (abs ([x] app x x))>
Subgoal 3 is:
diverge (app (abs (x\app x x)) (abs (x\app x x))) +
omega_diverge < search.
Subgoal 2:
CH : diverge (app (abs (x\app x x)) (abs (x\app x x))) +
============================
<eval/abs ([x] app x x):eval (abs ([x] app x x)) (abs ([x] app x x))>
Subgoal 3 is:
diverge (app (abs (x\app x x)) (abs (x\app x x))) +
omega_diverge < search.
Subgoal 3:
CH : diverge (app (abs (x\app x x)) (abs (x\app x x))) +
============================
diverge (app (abs (x\app x x)) (abs (x\app x x))) +
omega_diverge < search.
Proof completed.
Abella < Goodbye.