Require Import Omega.
Require Import mathcomp.ssreflect.ssreflect.
Require Import CTL_def dags demo.
Set Implicit Arguments.
Import Prenex Implicits.
Implicit Types (C D L : clause) (S : {fset clause}).
Require Import mathcomp.ssreflect.ssreflect.
Require Import CTL_def dags demo.
Set Implicit Arguments.
Import Prenex Implicits.
Implicit Types (C D L : clause) (S : {fset clause}).
Section Prune.
Variable (F : {fset sform}).
Hypothesis (sfc_F : sf_closed F).
Definition U := powerset F.
Definition S0 := [fset L in U | literalC L && lcons L].
Lemma Fsub s t X : t \in ssub s -> s \in X -> X \in U -> t \in F.
Lemma ReqU L C : L \in U -> C \in Req L -> C \in U.
Lemma SsubU S : S `<=` S0 -> {subset S <= U}.
Definition pAXn L S :=
[some C in Req L, ~~ suppS S C].
Definition pAU C S :=
[some u in C, if u is fAX (fAU s t)^+ then ~~ fulfillsAU S S0 s t C else false].
Definition pAR C S :=
[some u in C, if u is fAX (fAR s t)^- then ~~ fulfillsAR S S0 s t C else false].
Definition pcond L S := [|| pAXn L S, pAU L S | pAR L S].
Definition DD := prune pcond S0.
Definition subDD : {subset DD <= U}.
Lemma AXn_complete_DD : AXn_complete DD.
Lemma fulfillsAU_DD s t L : L \in DD -> fAX (fAU s t)^+ \in L -> fulfillsAU DD S0 s t L.
Lemma fulfillsAR_DD s t L : L \in DD -> fAX (fAR s t)^- \in L -> fulfillsAR DD S0 s t L.
Lemma demoDD_S0 : demo DD S0.
Lemma DD_size : size S0 <= 2^(size F).
Lemma Fs_size : size (Fs DD) <= size F.
Lemma DD_small_model u L : u \in Fs DD -> L \in DD ->
exists2 M : fmodel, #|M| <= size F * 2 ^ (2 * (size F) + 1)
& exists (w : M), forall s : sform, L |> s -> eval (interp' s) w.
Lemma DD_sat u L : u \in Fs DD -> L \in DD ->
exists (M : fmodel) (w : M), forall s : sform, L |> s -> eval (interp' s) w.
Definition coref (ref : clause -> Prop) S :=
forall C, C \in S0 `\` S -> ref C.
Inductive ref : clause -> Prop :=
| R1 S C : C \in U -> coref ref S -> ~~ suppS S C -> ref C
| R2 C D : D \in Req C -> ref D -> ref C
| R3 S C : S `<=` S0 -> coref ref S -> C \in S -> pAR C S -> ref C
| R4 S C : S `<=` S0 -> coref ref S -> C \in S -> pAU C S -> ref C.
Lemma corefD1 S C : ref C -> coref ref S -> coref ref (S `\` [fset C]).
Lemma coref_DD : coref ref DD.
Lemma DD_refute C : C \in U -> ~~ suppS DD C -> ref C.
End Prune.