{-# OPTIONS --safe --warning=error #-} open import Agda.Primitive using (Level; lzero; lsuc; _⊔_) open import LogicalFormulae open import Functions open import Numbers.Naturals.Semiring open import Numbers.Naturals.Order open import Vectors module Logic.PropositionalLogic where data Propositions {a : _} (primitives : Set a) : Set a where ofPrimitive : primitives → Propositions primitives false : Propositions primitives implies : (a b : Propositions primitives) → Propositions primitives prNot : {a : _} {pr : Set a} → Propositions pr → Propositions pr prNot p = implies p false impliesIsBigger : {a : _} {pr : Set a} {P Q : Propositions pr} → Q ≡ implies P Q → False impliesIsBigger {P = P} {Q} () impliesInjectiveL : {a : _} {A : Set a} → {p q r : Propositions A} → implies p q ≡ implies r q → p ≡ r impliesInjectiveL refl = refl impliesInjectiveR : {a : _} {A : Set a} → {p q r : Propositions A} → implies p q ≡ implies p r → q ≡ r impliesInjectiveR refl = refl impliesInjective : {a : _} {A : Set a} → {p q r s : Propositions A} → implies p q ≡ implies r s → (p ≡ r) && (q ≡ s) impliesInjective refl = refl ,, refl record Valuation {a : _} (primitives : Set a) : Set a where field v : Propositions primitives → Bool vFalse : v false ≡ BoolFalse vImplicationF : {p q : Propositions primitives} → v p ≡ BoolTrue → v q ≡ BoolFalse → v (implies p q) ≡ BoolFalse vImplicationVacuous : {p q : Propositions primitives} → v p ≡ BoolFalse → v (implies p q) ≡ BoolTrue vImplicationT : {p q : Propositions primitives} → v q ≡ BoolTrue → v (implies p q) ≡ BoolTrue -- Proposition 1a valuationIsDetermined : {a : _} {pr : Set a} → (v1 v2 : Valuation pr) → ({x : pr} → Valuation.v v1 (ofPrimitive x) ≡ Valuation.v v2 (ofPrimitive x)) → {x : Propositions pr} → Valuation.v v1 x ≡ Valuation.v v2 x valuationIsDetermined v1 v2 pr {ofPrimitive x} = pr valuationIsDetermined v1 v2 pr {false} rewrite Valuation.vFalse v1 | Valuation.vFalse v2 = refl valuationIsDetermined v1 v2 pr {implies x y} with valuationIsDetermined v1 v2 pr {x} valuationIsDetermined v1 v2 pr {implies x y} | eqX with valuationIsDetermined v1 v2 pr {y} ... | eqY with inspect (Valuation.v v1 x) valuationIsDetermined v1 v2 pr {implies x y} | eqX | eqY | BoolTrue with≡ p with inspect (Valuation.v v1 y) valuationIsDetermined v1 v2 pr {implies x y} | eqX | eqY | BoolTrue with≡ p | BoolTrue with≡ q rewrite p | q | Valuation.vImplicationT v2 {p = x} {q = y} (equalityCommutative eqY) | Valuation.vImplicationT v1 {p = x} {q = y} q = refl valuationIsDetermined v1 v2 pr {implies x y} | eqX | eqY | BoolTrue with≡ p | BoolFalse with≡ q rewrite p | q | Valuation.vImplicationF v1 p q | Valuation.vImplicationF v2 (equalityCommutative eqX) (equalityCommutative eqY) = refl valuationIsDetermined v1 v2 pr {implies x y} | eqX | eqY | BoolFalse with≡ p rewrite p | Valuation.vImplicationVacuous v1 {q = y} p | Valuation.vImplicationVacuous v2 {q = y} (equalityCommutative eqX) = refl extendValuation : {a : _} {pr : Set a} → (w : pr → Bool) → Valuation pr Valuation.v (extendValuation w) (ofPrimitive x) = w x Valuation.v (extendValuation w) false = BoolFalse Valuation.v (extendValuation w) (implies x y) with Valuation.v (extendValuation w) x Valuation.v (extendValuation w) (implies x y) | BoolTrue with Valuation.v (extendValuation w) y Valuation.v (extendValuation w) (implies x y) | BoolTrue | BoolTrue = BoolTrue Valuation.v (extendValuation w) (implies x y) | BoolTrue | BoolFalse = BoolFalse Valuation.v (extendValuation w) (implies x y) | BoolFalse = BoolTrue Valuation.vFalse (extendValuation w) = refl Valuation.vImplicationF (extendValuation w) {p} {q} pT qF with Valuation.v (extendValuation w) p Valuation.vImplicationF (extendValuation w) {p} {q} refl qF | BoolTrue with Valuation.v (extendValuation w) q Valuation.vImplicationF (extendValuation w) {p} {q} refl () | BoolTrue | BoolTrue Valuation.vImplicationF (extendValuation w) {p} {q} refl refl | BoolTrue | BoolFalse = refl Valuation.vImplicationF (extendValuation w) {p} {q} () qF | BoolFalse Valuation.vImplicationVacuous (extendValuation w) {p} {q} pF with Valuation.v (extendValuation w) p Valuation.vImplicationVacuous (extendValuation w) {p} {q} () | BoolTrue Valuation.vImplicationVacuous (extendValuation w) {p} {q} refl | BoolFalse = refl Valuation.vImplicationT (extendValuation w) {p} {q} qT with Valuation.v (extendValuation w) p Valuation.vImplicationT (extendValuation w) {p} {q} qT | BoolTrue with Valuation.v (extendValuation w) q Valuation.vImplicationT (extendValuation w) {p} {q} refl | BoolTrue | BoolTrue = refl Valuation.vImplicationT (extendValuation w) {p} {q} () | BoolTrue | BoolFalse Valuation.vImplicationT (extendValuation w) {p} {q} qT | BoolFalse = refl -- Proposition 1b valuationsAreFree : {a : _} {pr : Set a} → (w : pr → Bool) → {x : pr} → Valuation.v (extendValuation w) (ofPrimitive x) ≡ w x valuationsAreFree w = refl Tautology : {a : _} {pr : Set a} (prop : Propositions pr) → Set a Tautology {pr = pr} prop = {v : Valuation pr} → Valuation.v v prop ≡ BoolTrue record IsSubset {a b : _} (sub : Set a) (super : Set b) : Set (a ⊔ b) where field ofElt : sub → super mapProp : {a b : _} {pr1 : Set a} {pr2 : Set b} → (pr1 → pr2) → Propositions pr1 → Propositions pr2 mapProp f (ofPrimitive x) = ofPrimitive (f x) mapProp f false = false mapProp f (implies p q) = implies (mapProp f p) (mapProp f q) inheritedValuation : {a b : _} {sub : Set a} {super : Set b} → (IsSubset sub super) → Valuation super → Valuation sub Valuation.v (inheritedValuation isSub v) prop = Valuation.v v (mapProp (IsSubset.ofElt isSub) prop) Valuation.vFalse (inheritedValuation isSub v) = Valuation.vFalse v Valuation.vImplicationF (inheritedValuation isSub v) pT qF = Valuation.vImplicationF v pT qF Valuation.vImplicationVacuous (inheritedValuation isSub v) pF = Valuation.vImplicationVacuous v pF Valuation.vImplicationT (inheritedValuation isSub v) qT = Valuation.vImplicationT v qT inheritedValuation' : {a b : _} {sub : Set a} {super : Set b} → (IsSubset sub (Propositions super)) → Valuation super → (x : sub) → Bool inheritedValuation' subset v x = Valuation.v v (IsSubset.ofElt subset x) record Entails {a b : _} {sub : Set a} {super : Set b} (S : IsSubset sub (Propositions super)) (P : Propositions super) : Set (a ⊔ b) where field entails : {v : Valuation super} → ({s : sub} → inheritedValuation' S v s ≡ BoolTrue) → Valuation.v v P ≡ BoolTrue data ThreeElements : Set where One : ThreeElements Two : ThreeElements Three : ThreeElements indexAxiom : {a : _} (A : Set a) → ThreeElements → Set a indexAxiom A One = Propositions A && Propositions A indexAxiom A Two = Propositions A & Propositions A & Propositions A indexAxiom A Three = Propositions A indexPropositionalAxioms : {a : _} {A : Set a} → Set a indexPropositionalAxioms {A = A} = Sg ThreeElements (indexAxiom A) -- An axiom system is simply a subset of a set of propositions. propositionalAxioms : {a : _} {A : Set a} → IsSubset (indexPropositionalAxioms {A = A}) (Propositions A) IsSubset.ofElt propositionalAxioms (One , (p ,, q)) = implies p (implies q p) IsSubset.ofElt propositionalAxioms (Two , record { one = p ; two = q ; three = r }) = implies (implies p (implies q r)) (implies (implies p q) (implies p r)) IsSubset.ofElt propositionalAxioms (Three , p) = implies (prNot (prNot p)) p record Selection {a : _} {A : Set a} {n : ℕ} (l : Vec A n) : Set a where field element : A position : ℕ pos