Library Sat
A somehow abstract interface to work with reducibility candidates
or saturated sets.
The type of "saturated sets" and basic relations: equality and membership
Parameter SAT : Type.
Parameter eqSAT : SAT -> SAT -> Prop.
Parameter inSAT : term -> SAT -> Prop.
Parameter eqSAT_def : ∀ X Y,
eqSAT X Y <-> (∀ t, inSAT t X <-> inSAT t Y).
Definition inclSAT A B := ∀ t, inSAT t A -> inSAT t B.
Parameter inSAT_morph : Proper ((@eq term) ==> eqSAT ==> iff) inSAT.
Parameter eqSAT : SAT -> SAT -> Prop.
Parameter inSAT : term -> SAT -> Prop.
Parameter eqSAT_def : ∀ X Y,
eqSAT X Y <-> (∀ t, inSAT t X <-> inSAT t Y).
Definition inclSAT A B := ∀ t, inSAT t A -> inSAT t B.
Parameter inSAT_morph : Proper ((@eq term) ==> eqSAT ==> iff) inSAT.
Essential properties of saturated sets :
- they are sets of SN terms
- they are closed by head expansion
Parameter sat_sn : ∀ t S, inSAT t S -> sn t.
Parameter inSAT_exp : ∀ S u m,
boccur 0 m = true \/ sn u ->
inSAT (subst u m) S ->
inSAT (App (Abs m) u) S.
Parameter inSAT_exp : ∀ S u m,
boccur 0 m = true \/ sn u ->
inSAT (subst u m) S ->
inSAT (App (Abs m) u) S.
A term that belongs to all saturated sets (e.g. variables)
Closure properties are preserved by head contexts
Parameter inSAT_context : ∀ u u' v,
(∀ S, inSAT u S -> inSAT u' S) ->
∀ S, inSAT (App u v) S -> inSAT (App u' v) S.
(∀ S, inSAT u S -> inSAT u' S) ->
∀ S, inSAT (App u v) S -> inSAT (App u' v) S.
The set of strongly normalizing terms
Non-depenent products
Parameter prodSAT : SAT -> SAT -> SAT.
Parameter prodSAT_morph : Proper (eqSAT ==> eqSAT ==> eqSAT) prodSAT.
Parameter prodSAT_intro : ∀ A B m,
(∀ v, inSAT v A -> inSAT (subst v m) B) ->
inSAT (Abs m) (prodSAT A B).
Parameter prodSAT_elim : ∀ A B u v,
inSAT u (prodSAT A B) ->
inSAT v A ->
inSAT (App u v) B.
Parameter prodSAT_morph : Proper (eqSAT ==> eqSAT ==> eqSAT) prodSAT.
Parameter prodSAT_intro : ∀ A B m,
(∀ v, inSAT v A -> inSAT (subst v m) B) ->
inSAT (Abs m) (prodSAT A B).
Parameter prodSAT_elim : ∀ A B u v,
inSAT u (prodSAT A B) ->
inSAT v A ->
inSAT (App u v) B.
Intersection
Parameter interSAT : ∀ A:Type, (A -> SAT) -> SAT.
Parameter interSAT_morph : ∀ A A' (F:A->SAT) (G:A'->SAT),
indexed_relation eqSAT F G ->
eqSAT (interSAT F) (interSAT G).
Parameter interSAT_intro : ∀ A F u,
A ->
(∀ x:A, inSAT u (F x)) ->
inSAT u (interSAT F).
Parameter interSAT_elim : ∀ A F u,
inSAT u (interSAT F) ->
∀ x:A, inSAT u (F x).
End SAT.
Parameter interSAT_morph : ∀ A A' (F:A->SAT) (G:A'->SAT),
indexed_relation eqSAT F G ->
eqSAT (interSAT F) (interSAT G).
Parameter interSAT_intro : ∀ A F u,
A ->
(∀ x:A, inSAT u (F x)) ->
inSAT u (interSAT F).
Parameter interSAT_elim : ∀ A F u,
inSAT u (interSAT F) ->
∀ x:A, inSAT u (F x).
End SAT.
Require Import Can.
Module SatSet <: SAT.
Definition SAT := {P:term->Prop|is_cand P}.
Definition inSAT t (S:SAT) := proj1_sig S t.
Definition eqSAT X Y := ∀ t, inSAT t X <-> inSAT t Y.
Lemma eqSAT_def : ∀ X Y,
eqSAT X Y <-> (∀ t, inSAT t X <-> inSAT t Y).
Instance inSAT_morph : Proper ((@eq term) ==> eqSAT ==> iff) inSAT.
Qed.
Definition inclSAT A B := ∀ t, inSAT t A -> inSAT t B.
Global Instance inclSAT_ord : PreOrder inclSAT.
Qed.
Lemma sat_sn : ∀ t S, inSAT t S -> sn t.
Definition daimon := Ref 0.
Lemma varSAT : ∀ S, inSAT daimon S.
Lemma inSAT_exp : ∀ S u m,
boccur 0 m = true \/ sn u ->
inSAT (subst u m) S ->
inSAT (App (Abs m) u) S.
Lemma inSAT_context : ∀ u u' v,
(∀ S, inSAT u S -> inSAT u' S) ->
∀ S, inSAT (App u v) S -> inSAT (App u' v) S.
Definition snSAT : SAT := exist _ sn cand_sn.
Lemma snSAT_intro : ∀ t, sn t -> inSAT t snSAT.
Definition prodSAT (X Y:SAT) : SAT.
exists (Arr (proj1_sig X) (proj1_sig Y)).
Defined.
Lemma prodSAT_intro : ∀ A B m,
(∀ v, inSAT v A -> inSAT (subst v m) B) ->
inSAT (Abs m) (prodSAT A B).
Lemma prodSAT_elim : ∀ A B u v,
inSAT u (prodSAT A B) ->
inSAT v A ->
inSAT (App u v) B.
Instance prodSAT_morph : Proper (eqSAT ==> eqSAT ==> eqSAT) prodSAT.
Qed.
Instance prodSAT_mono : Proper (inclSAT --> inclSAT ++> inclSAT) prodSAT.
Qed.
Definition interSAT (A:Type) (F:A -> SAT) : SAT :=
exist _ (Inter A (fun x => proj1_sig (F x)))
(is_can_Inter _ _ (fun x => proj2_sig (F x))).
Lemma interSAT_morph : ∀ A A' (F:A->SAT) (G:A'->SAT),
indexed_relation eqSAT F G ->
eqSAT (interSAT F) (interSAT G).
Lemma interSAT_intro : ∀ A F u,
A ->
(∀ x:A, inSAT u (F x)) ->
inSAT u (interSAT F).
Lemma interSAT_intro' : ∀ A (P:A->Prop) F t,
sn t ->
(∀ x, P x -> inSAT t (F x)) ->
inSAT t (interSAT (fun p:sig P => F (proj1_sig p))).
Lemma interSAT_elim : ∀ A F u,
inSAT u (interSAT F) ->
∀ x:A, inSAT u (F x).
Lemma interSAT_mono A (F G:A->SAT):
(∀ x, inclSAT (F x) (G x)) ->
inclSAT (interSAT F) (interSAT G).
End SatSet.
Export SatSet.
Derived facts
Instance eqSAT_equiv : Equivalence eqSAT.
Qed.
Lemma interSAT_morph_subset :
∀ A (P Q:A->Prop) (F:sig P->SAT) (G:sig Q->SAT),
(∀ x, P x <-> Q x) ->
(∀ x Px Qx,
eqSAT (F (exist P x Px)) (G (exist Q x Qx))) ->
eqSAT (interSAT F) (interSAT G).
Lemma KSAT_intro : ∀ A t m,
sn t ->
inSAT m A ->
inSAT (App2 K m t) A.
Lemma SAT_daimon1 : ∀ S u,
sn u ->
inSAT (App daimon u) S.
Dependent product The realizability relation of a dependent product.
It is the intersection of all reducibility candidates {x}F -> {f(x)}G(x)
when x ranges A.
Definition piSAT0 A B (F:A->SAT) (G:A->B->SAT) (f:A->B) :=
interSAT (fun x => prodSAT (F x) (G x (f x))).
Lemma piSAT0_intro : ∀ A B F G (f:A->B) t,
sn t ->
(∀ x u, inSAT u (F x) -> inSAT (App t u) (G x (f x))) ->
inSAT t (piSAT0 F G f).
Lemma piSAT0_elim : ∀ A B F G (f:A->B) x t u,
inSAT t (piSAT0 F G f) ->
inSAT u (F x) ->
inSAT (App t u) (G x (f x)).
interSAT (fun x => prodSAT (F x) (G x (f x))).
Lemma piSAT0_intro : ∀ A B F G (f:A->B) t,
sn t ->
(∀ x u, inSAT u (F x) -> inSAT (App t u) (G x (f x))) ->
inSAT t (piSAT0 F G f).
Lemma piSAT0_elim : ∀ A B F G (f:A->B) x t u,
inSAT t (piSAT0 F G f) ->
inSAT u (F x) ->
inSAT (App t u) (G x (f x)).