diff --git a/encodings/booleans.lp b/encodings/booleans.lp index 7605c1d27a088cda8e568bdb4cd35cd866de5981..2ff97151c411b2932f1e20fc7300574bab7e2b4f 100644 --- a/encodings/booleans.lp +++ b/encodings/booleans.lp @@ -5,13 +5,9 @@ require open definition false ≔ forall {bool} (λx, x) definition true ≔ impd {false} (λ_, false) -symbol {|and|}: Bool ⇒ Bool ⇒ Bool -set infix left 6 "∧" ≔ {|and|} -constant symbol or: Bool ⇒ Bool ⇒ Bool -set infix left 5 "∨" ≔ or +definition not P ≔ impd {P} (λ_, false) +set prefix 7 "¬" ≔ not set builtin "bot" ≔ false set builtin "top" ≔ true -definition not P ≔ impd {P} (λ_, false) -set prefix 7 "¬" ≔ not diff --git a/encodings/if.lp b/encodings/if.lp index 52aa4a2ac9f5c0b5a6375581120802b9fe4ede33..511bb07b3d8b4307fa9db69303f8da297620fdbd 100644 --- a/encodings/if.lp +++ b/encodings/if.lp @@ -1,56 +1,16 @@ require open personoj.encodings.lhol personoj.encodings.pvs_cert personoj.encodings.booleans -require personoj.encodings.deferred as Deferred -require open personoj.encodings.subtype //FIXME: why must it be the last import? -symbol if {U: Set} {V: Set} (S: Set) -: ε (U ⊑ S) ⇒ ε (V ⊑ S) ⇒ Bool ⇒ η U ⇒ η V ⇒ η S - -symbol lif {U: Set} {V: Set} (S: Set) -: Deferred.p (U ⊑ S) ⇒ Deferred.p (V ⊑ S) ⇒ Bool ⇒ Deferred.t U ⇒ Deferred.t V ⇒ η S - -// lazy if -set flag "print_implicits" on -rule lif _ &pr _ true &t _ → ↑ (Deferred.unquote_p &pr) (Deferred.unquote &t) -rule lif _ _ &pr false _ &f → ↑ (Deferred.unquote_p &pr) (Deferred.unquote &f) - -// The if is lazy, that is, the expression [if true 2 (1/0)] must type check and -// return 2. For this, we use the [Deferred.t] datatype. But remember that [if] -// is typed by a super type of [2] and [1/0]. This super type is provided as -// argument, and the types of the expressions must be verified to be sub-types -// of this super-types. Since these arguments are deferred and can be ill-typed, -// we want to defer the verification of sub-type as well. Therefore, we -// introduce the [lifSet] type to type the [lif]. -// [lifset &T &F &S p] reduces to the type of the function that maps a proof of -// &T is a sub-type of &S to &S if [p] is true and the function that maps a -// proof of &F is a sub-type of &S if [p] is false. -// The result of [lif S true e1 e2] is the function that maps the proof of -// sub-typing [Te1 ⊑ S] to the evaluation (or unquoting) of [e1]. -type λ (T S: Set), ε (T ⊑ S) ⇒ η S -symbol lifSet (T U S: Set): Bool ⇒ TYPE -symbol tt: Bool -symbol ff: Bool -rule lifSet &U _ &S true → ε (&U ⊑ &S) ⇒ η &S -rule lifSet _ &F &S false → ε (&F ⊑ &S) ⇒ η &S - -compute λ(U V S: Set), lifSet U V S tt - -symbol lifn {U: Set} {V: Set} (S: Set) (p: Bool) -: Deferred.t U ⇒ Deferred.t V ⇒ lifSet U V S p - -rule lifn {&U} {&V} &S true &t &f → λh:ε (&U ⊑ &S), ↑ {&U} {&S} h (Deferred.unquote &t) - -symbol if3 {u: Set} {v: Set} (s: Set) (_: ε (u ⊑ s)) (_: ε (v ⊑ s)) (p: Bool): - (ε p ⇒ η u) ⇒ (ε (¬ p) ⇒ η v) ⇒ η s - -rule if3 &s &pr _ true &bh _ → ↑ &pr (&bh (λx, x)) - and if3 &s _ &pr false _ &bh → ↑ &pr (&bh (λx, x)) +// Polymorphic if +symbol if {s: Set} (p: Bool): (ε p ⇒ η s) ⇒ (ε (¬ p) ⇒ η s) ⇒ η s +rule if true &then _ → &then (λx, x) + and if false _ &else → &else (λx, x) // Definition of logical connectors with if3 -definition band p q ≔ - if3 {bool} {bool} bool (S_Refl bool) (S_Refl bool) p (λ_, q) (λ_, false) -definition bor p q ≔ - if3 {bool} {bool} bool (S_Refl bool) (S_Refl bool) p (λ_, true) (λ_, q) -definition imp p q ≔ - if3 {bool} {bool} bool (S_Refl bool) (S_Refl bool) p (λ_, q) (λ_, true) +definition band p q ≔ if {bool} p (λ_, q) (λ_, false) +definition bor p q ≔ if {bool} p (λ_, true) (λ_, q) +definition imp p q ≔ if {bool} p (λ_, q) (λ_, true) +set infix left 7 "∧" ≔ band +set infix left 6 "∧" ≔ bor +set infix left 5 "⊃" ≔ imp diff --git a/sandbox/ifs.lp b/sandbox/ifs.lp new file mode 100644 index 0000000000000000000000000000000000000000..9379a03097fd736ec6da1b777297395923e31146 --- /dev/null +++ b/sandbox/ifs.lp @@ -0,0 +1,48 @@ +require open personoj.encodings.lhol + personoj.encodings.pvs_cert + personoj.encodings.booleans +require personoj.encodings.deferred as Deferred +require open personoj.encodings.subtype //FIXME: why must it be the last import? + +symbol if {U: Set} {V: Set} (S: Set) +: ε (U ⊑ S) ⇒ ε (V ⊑ S) ⇒ Bool ⇒ η U ⇒ η V ⇒ η S + +symbol lif {U: Set} {V: Set} (S: Set) +: Deferred.p (U ⊑ S) ⇒ Deferred.p (V ⊑ S) ⇒ Bool ⇒ Deferred.t U ⇒ Deferred.t V ⇒ η S + +// lazy if +set flag "print_implicits" on +rule lif _ &pr _ true &t _ → ↑ (Deferred.unquote_p &pr) (Deferred.unquote &t) +rule lif _ _ &pr false _ &f → ↑ (Deferred.unquote_p &pr) (Deferred.unquote &f) + +// The if is lazy, that is, the expression [if true 2 (1/0)] must type check and +// return 2. For this, we use the [Deferred.t] datatype. But remember that [if] +// is typed by a super type of [2] and [1/0]. This super type is provided as +// argument, and the types of the expressions must be verified to be sub-types +// of this super-types. Since these arguments are deferred and can be ill-typed, +// we want to defer the verification of sub-type as well. Therefore, we +// introduce the [lifSet] type to type the [lif]. +// [lifset &T &F &S p] reduces to the type of the function that maps a proof of +// &T is a sub-type of &S to &S if [p] is true and the function that maps a +// proof of &F is a sub-type of &S if [p] is false. +// The result of [lif S true e1 e2] is the function that maps the proof of +// sub-typing [Te1 ⊑ S] to the evaluation (or unquoting) of [e1]. +type λ (T S: Set), ε (T ⊑ S) ⇒ η S +symbol lifSet (T U S: Set): Bool ⇒ TYPE +symbol tt: Bool +symbol ff: Bool +rule lifSet &U _ &S true → ε (&U ⊑ &S) ⇒ η &S +rule lifSet _ &F &S false → ε (&F ⊑ &S) ⇒ η &S + +compute λ(U V S: Set), lifSet U V S tt + +symbol lifn {U: Set} {V: Set} (S: Set) (p: Bool) +: Deferred.t U ⇒ Deferred.t V ⇒ lifSet U V S p + +rule lifn {&U} {&V} &S true &t &f → λh:ε (&U ⊑ &S), ↑ {&U} {&S} h (Deferred.unquote &t) + +symbol if3 {u: Set} {v: Set} (s: Set) (_: ε (u ⊑ s)) (_: ε (v ⊑ s)) (p: Bool): + (ε p ⇒ η u) ⇒ (ε (¬ p) ⇒ η v) ⇒ η s + +rule if3 &s &pr _ true &bh _ → ↑ &pr (&bh (λx, x)) + and if3 &s _ &pr false _ &bh → ↑ &pr (&bh (λx, x))