ImpAlg.ImplicativeStructures

Set Implicit Arguments.
Set Contextual Implicit.

Require Import Utf8.
Require Import Morphisms.
Require Import ImpAlg.Ens.
Require Import ImpAlg.Lattices.

We define the lifting of the arrow (a ↦ b) for sets (A ↦ b, a ↦ B, A ↦ B)

Definition arrow_set_l `{X:Set} `{arrow:X X X} (A:Ens) (b:X):Ens :=
  fun x => a, A a x = arrow a b.
Definition arrow_set_r `{X:Set} `{arrow:X X X} (a:X) (B:Ens):Ens :=
    fun x => b, B b x = arrow a b.
Definition arrow_set `{X:Set} `{arrow:X X X} (A:Ens) (B:Ens):Ens :=
    fun x => a,∃b, A a B b x = arrow a b.

Global Instance arrow_set_Proper `{X:Set} `{arrow:X X X} a:
  Proper ((@same_set X) ==> (@same_set X)) ((@arrow_set_r X arrow) a).
Proof.
  intros A B HAB.
  split;intros Hx; destruct Hx as [b [Hb Hx]];
  exists b;
  split;[apply HAB,Hb| assumption|apply HAB,Hb| assumption].
Qed.

Implicative Structures

Definition

Class ImplicativeStructure `{CL:CompleteLattice} :=
  {
    arrow:X X X;

    arrow_mon_l: a a' b, ord a a' -> ord (arrow a' b ) (arrow a b );
    arrow_mon_r: a b b', ord b b' -> ord (arrow a b ) (arrow a b');

    arrow_meet: a B, arrow a (meet_set B) = meet_set (@arrow_set_r _ arrow a B)
  }.

Infix "↦" := arrow (at level 60, right associativity):ia_scope.
Notation "a ↪ B":= (@arrow_set_r _ _ a B) (at level 69):ia_scope.

Generalizable Variables X ord join meet arrow L meet_set join_set.

Properties


Lemma arrow_mon `{IS:ImplicativeStructure}: a a' b b' , a' a -> b b' -> arrow a b arrow a' b'.
Proof.
  intros.
  apply (ord_trans _ (a' b)).
  - apply arrow_mon_l; auto.
  - apply arrow_mon_r; auto.
Qed.

Lemma arrow_prenex `{IS:ImplicativeStructure}:
   a f, (λ y:X, b : X, y = a f a b) (@arrow_set_r X arrow a (λ y : X, b : X, y = f a b)).
Proof.
  intros.
  unfold arrow_set_l.
  split;intros;
  destruct H as [b Hb].
  - exists (f a b).
    split;[exists b | rewrite Hb];reflexivity.
  - destruct Hb as [Hb Hy].
    destruct Hb as [c Hc].
    exists c;rewrite Hy,Hc;reflexivity.
Qed.

Lemma arrow_bot `{IS:ImplicativeStructure}:
   a, a = .
Proof.
  intros a.
  rewrite <- meet_emptyset.
  rewrite arrow_meet.
  apply meet_same_set;split.
  - intros (b,(Hb,_)).
    contradict Hb.
  - intros H.
    contradict H.
Qed.


Encoding the λ-calculus

Application

We begin by defining the application of "a" to "b", denoted by "a@b".

Definition app `{IS:ImplicativeStructure} a b:= (fun x => a b x).
Infix "@" := app (at level 59, left associativity).

Properties of the application

Lemma app_mon_l `{IS:ImplicativeStructure}:
   a b c, a b a @ c b @ c.
Proof.
  intros a b c Hab.
  unfold app.
  apply meet_subset.
  intros x Hx.
  apply (ord_trans _ _ _ Hab Hx).
Qed.

Lemma app_mon_r `{IS:ImplicativeStructure}:
   a b c, b c a @ b a @ c.
Proof.
  intros a b c Hbc.
  apply meet_subset.
  intros x Hx.
  apply (ord_trans _ _ _ Hx).
  now apply arrow_mon_l.
Qed.

Lemma app_mon `{IS:ImplicativeStructure}:
   a a' b b', a a' b b' a @ b a' @ b'.
Proof.
  intros a a' b b' Ha Hb.
  eapply ord_trans;[apply (app_mon_l _ _ _ Ha)|].
  apply (app_mon_r _ _ _ Hb).
Qed.

Lemma app_beta `{IS:ImplicativeStructure}:
   a b, (a b) @ a b.
Proof.
  intros a b.
  apply meet_elim.
  reflexivity.
Qed.

Lemma app_eta `{IS:ImplicativeStructure}:
   a b, a b (a@b).
Proof.
  intros a b. unfold app.
  rewrite arrow_meet.
  apply meet_intro.
  intros x (c,(Hx,Hc)).
  now subst x.
Qed.

Lemma app_min `{IS:ImplicativeStructure}:
   a b, min (fun x => a b x) (a@b).
Proof.
intros a b.
split.
- unfold lb,app. intros y Hy. now apply meet_elim.
- apply app_eta.
Qed.

Lemma adjunction `{IS:ImplicativeStructure}:
   a b c, a @ b c a b c.
Proof.
  intros.
  split;intros.
  - apply (ord_trans _ _ _ (app_eta a b)).
    now apply arrow_mon_r.
  - apply meet_elim.
    assumption.
Qed.

Abstraction

We now define the abstraction of a function "f", which we denote by "λ' f".

Definition abs `{IS:ImplicativeStructure} f:= (fun x => a, x = a f a).
Notation "λ- f":= (abs f) (at level 60):ia_scope.

Properties of the abstraction

Lemma abs_mon `{IS:ImplicativeStructure}:
    f g, (a, f a g a) (λ- f) (λ- g).
Proof.
intros f g H.
auto_meet_leq.
now apply arrow_mon_r.
Qed.

Lemma betarule `{IS:ImplicativeStructure}:
   f a, (λ- f) @ a f a.
Proof.
  intros f a.
  apply meet_elim.
  apply meet_elim.
  exists a;reflexivity.
Qed.

Definition eta `{IS:ImplicativeStructure}a := fun x => a @ x .
Lemma etarule `{IS:ImplicativeStructure}:
    a, a (λ- (eta a)).
Proof.
  intros a.
  unfold eta,app,abs.
  apply meet_intro.
  intros b (x,Hb);subst.
  rewrite arrow_meet.
  apply meet_intro.
  intros z (b,(Hz,Hb)).
  subst.
  assumption.
Qed.

Lemma beta_red `{IS:ImplicativeStructure}:
   f t u, f t u (λ- f)@t u.
Proof.
  intros f t u H.
  eapply ord_trans;[apply betarule|exact H].
Qed.

Properties of closure

Definition upwards_closure `{IS:ImplicativeStructure} (A:Ens):= a b, a b A a A b .
Definition app_closure `{IS:ImplicativeStructure} (A:Ens):= a b, A a A b A (a@b).
Definition mod_pon_closure `{IS:ImplicativeStructure} (A:Ens):= a b, A a A (ab) A b.

Remark mod_pon_app `{IS:ImplicativeStructure}:
   A:Ens, upwards_closure A (app_closure A <-> mod_pon_closure A).
Proof.
  intros A UpC. split;intros H a b Ha Hb.
  - apply (UpC ((ab)@a)).
    + now apply adjunction.
    + now apply H.
  - apply (H b);intuition.
    apply (UpC a).
    + now apply adjunction.
    + assumption.
Qed.