Require Import mathcomp.ssreflect.ssreflect.
Require Import modular_hilbert CTL_def hilbert.

Set Implicit Arguments.
Import Prenex Implicits.

Emerson's Axiomatization

In the Handbook of Theoretical Computer Science Emerson gives an axiomatization of CTL. We show that this axiomatization is equivalent to the Hilbert system employed in our completeness proof.
Note: The Infrastructure for Hilbert proofs only works for the "Canonical" Hilbert system for a given type of formulas. We use modules to ensure that the right system is considered canonical at the right time.

Module Eme90.
  Section Hilbert.

The defined logical operations are only available once the respective records (pSystem etc.) have been declared. Hence we introduce local notations and later restate some of the axioms and rules using the defined notations from modular_hilbert.v

  Definition fEX s := (~~: fAX (~~: s)).
  Definition fEU s t := (~~: fAR (~~: s) (~~: t)).
  Definition fAG s := fAR fF s.

  Inductive prv : form -> Prop :=
  | rMP s t : prv (s ---> t) -> prv s -> prv t
  | axK s t : prv (s ---> t ---> s)
  | axS s t u : prv ((u ---> s ---> t) ---> (u ---> s) ---> u ---> t)
  | axDN s : prv (((s ---> fF) ---> fF) ---> s)

  | rGen s : prv s -> prv (fAG s)

  | axEXD' s t : prv (fEX (s :\/: t) <--> fEX s :\/: fEX t)
  | axReg' s t : prv (fAG (s ---> t) ---> fEX s ---> fEX t)

  | axSer' : prv (fEX (fF ---> fF))
  | axAXT : prv (fAX (fF ---> fF))
  | axEUeq' s t : prv (fEU s t <--> t :\/: (s :/\: fEX (fEU s t)))
  | axAUeq' s t : prv (fAU s t <--> t :\/: (s :/\: fAX (fAU s t)))

  | axAUr' s t u : prv (fAG (u ---> ~~:t :/\: fEX u) ---> u ---> ~~: fAU s t)
  | axEUr' s t u : prv (fAG (u ---> ~~:t :/\: (s ---> fAX u)) ---> u ---> ~~: fEU s t)

  | axAXdef' s : prv (fAX s <--> ~~: fEX (~~: s))
  | axARdef' s t : prv (fAR s t <--> ~~: fEU (~~: s) (~~: t))
  .
End Hilbert.

Completeness

We show completeness by showing admissibility of the rules and axoms of the Hilbert system IC.
The pSystem instance is immedate. For the kSystem instance we need to show the necessitation rule and the and normality scheme

Canonical Structure prv_mSystem := MSystem rMP axK axS.
Canonical Structure prv_pSystem := PSystem axDN.

Lemma axAXdef s : prv (fAX s <--> ~~: fEX (~~: s)).
Lemma axEXD s t : prv (fEX (s :\/: t) <--> fEX s :\/: fEX t).
Lemma axReg s t : prv (fAG (s ---> t) ---> fEX s ---> fEX t).

Lemma rRegEX s t : prv (s ---> t) -> prv (fEX s ---> fEX t).

Lemma rRegAX s t : prv (s ---> t) -> prv (fAX s ---> fAX t).

Lemma rNec s : prv s -> prv (fAX s).

Lemma axABBA s t : prv (fAX s :/\: fAX t ---> fAX (s :/\: t)).

Lemma axN s t : prv (fAX (s ---> t) ---> fAX s ---> fAX t).

Canonical Structure prv_kSystem := KSystem rNec axN.

Lemma axSer : prv (fEX Top).
Lemma axEUeq s t : prv (fEU s t <--> t :\/: (s :/\: fEX (fEU s t))).
Lemma axAUeq s t : prv (fAU s t <--> t :\/: (s :/\: fAX (fAU s t))).
Lemma axAUr s t u : prv (fAG (u ---> ~~:t :/\: fEX u) ---> u ---> ~~: fAU s t).
Lemma axEUr s t u : prv (fAG (u ---> ~~:t :/\: (s ---> fAX u)) ---> u ---> ~~: fEU s t).
Lemma axARdef s t : prv (fAR s t <--> ~~: fEU (~~: s) (~~: t)).

Admissibility of the induction rules

Lemma AR_ind s t u : prv (u ---> t) -> prv (u ---> (s ---> fF) ---> fAX u) -> prv (u ---> fAR s t).

Lemma AU_ind_aux s t u : prv (t ---> u) -> prv (fAX u ---> u) -> prv ((fAU s t) ---> u).

Lemma AU_ind s t u : prv (t ---> u) -> prv (s ---> fAX u ---> u) -> prv ((fAU s t) ---> u).

Introducion/Inversion Rules

Lemma ax_serial : prv (fAX fF ---> fF).

Lemma axAUI s t : prv (t ---> fAU s t).

Lemma axAUf s t : prv (s ---> fAX (fAU s t) ---> fAU s t).

Lemma axARE s t : prv (fAR s t ---> t).

Lemma axARu s t : prv (fAR s t ---> (s ---> fF) ---> fAX (fAR s t)).

End Eme90.

Theorem Eme90_translation s : IC.prv s -> Eme90.prv s.

Soundness

We show soundness by proving all rules admissible in IC. Importing IC enables using the infrastructure for Hilbert proofs for the system IC.
Import IC.

Lemma rGen s : prv s -> prv (AR Bot s).

Lemma axEXAXI s t : prv (EX s ---> AX (s ---> t) ---> EX t).

Lemma axAUr (s t u : form) : prv (AR Bot (u ---> ~~:t :/\: EX u) ---> u ---> ~~: AU s t).

Lemma axEUr s t u : prv (AR Bot (u ---> ~~:t :/\: (s ---> fAX u)) ---> u ---> ~~: EU s t).

Lemma axEUeq (s t : form) : prv (EU s t <--> t :\/: s :/\: EX (EU s t)).
Lemma axAUeq (s t : form) : prv (AU s t <--> t :\/: s :/\: AX (AU s t)).

Lemma axEXD s t : prv (EX (s :\/: t) <--> EX s :\/: EX t).

Lemma axReg s t : prv (AR Bot (s ---> t) ---> EX s ---> EX t).

Lemma axAXdef s : prv (AX s <--> ~~: EX (~~: s)).

Lemma axARdef s t : prv (fAR s t <--> ~~: EU (~~: s) (~~: t)).

Lemma axSer : prv (EX (fF ---> fF)).

Lemma axAXT : prv (AX (fF ---> fF)).

Theorem Eme90_sound s : Eme90.prv s -> prv s.