|
| 1 | +module Vatras.Data.Prop.Properties {F : Set} where |
| 2 | + |
| 3 | +import Data.Bool as Bool |
| 4 | +open import Data.Bool.Properties using (∧-comm; ∧-zeroˡ; ∧-zeroʳ) |
| 5 | +open import Data.Empty using (⊥) |
| 6 | +open import Data.Product as Product using (Σ; _×_; ∃-syntax; _,_) |
| 7 | +open import Data.Sum using (_⊎_; inj₁; inj₂) |
| 8 | + |
| 9 | +open import Relation.Nullary.Negation renaming (¬_ to negate) |
| 10 | +open import Relation.Binary.PropositionalEquality as Eq using (_≡_; refl; cong; sym; trans) |
| 11 | +open Eq.≡-Reasoning |
| 12 | + |
| 13 | +open import Vatras.Data.Prop |
| 14 | +open import Vatras.Util.AuxProofs using (true≢false) |
| 15 | + |
| 16 | +all-true : Assignment F |
| 17 | +all-true _ = Bool.true |
| 18 | + |
| 19 | +all-false : Assignment F |
| 20 | +all-false _ = Bool.false |
| 21 | + |
| 22 | +NonContradiction : |
| 23 | + ∀ {b} {p : Prop F} (a : Assignment F) |
| 24 | + → eval p a ≡ b |
| 25 | + → eval (¬ p) a ≡ Bool.not b |
| 26 | +NonContradiction _ eq = cong Bool.not eq |
| 27 | + |
| 28 | +NonContradiction' : |
| 29 | + ∀ (p : Prop F) (a : Assignment F) |
| 30 | + → eval p a ≡ Bool.true |
| 31 | + → eval p a ≡ Bool.false |
| 32 | + → ⊥ |
| 33 | +NonContradiction' _ _ = true≢false |
| 34 | + |
| 35 | +Satisfying : Prop F → Assignment F → Set |
| 36 | +Satisfying p a = eval p a ≡ Bool.true |
| 37 | + |
| 38 | +Unsatisfying : Prop F → Assignment F → Set |
| 39 | +Unsatisfying p a = eval p a ≡ Bool.false |
| 40 | + |
| 41 | +Satisfiable : Prop F → Set |
| 42 | +Satisfiable p = Σ (Assignment F) (Satisfying p) |
| 43 | + |
| 44 | +Falsifiable : Prop F → Set |
| 45 | +Falsifiable p = Σ (Assignment F) (Unsatisfying p) |
| 46 | + |
| 47 | +Tautology : Prop F → Set |
| 48 | +Tautology p = ∀ a → Satisfying p a |
| 49 | + |
| 50 | +Contradiction : Prop F → Set |
| 51 | +Contradiction p = ∀ a → Unsatisfying p a |
| 52 | + |
| 53 | +Const : Prop F → Set |
| 54 | +Const p = Tautology p ⊎ Contradiction p |
| 55 | + |
| 56 | +Const' : Prop F → Set |
| 57 | +Const' p = ∃[ b ] (∀ a → eval p a ≡ b) |
| 58 | + |
| 59 | +Const→Const' : ∀ {p} → Const p → Const' p |
| 60 | +Const→Const' (inj₁ taut ) = Bool.true , taut |
| 61 | +Const→Const' (inj₂ contr) = Bool.false , contr |
| 62 | + |
| 63 | +Const'→Const : ∀ {p} → Const' p → Const p |
| 64 | +Const'→Const (Bool.true , taut ) = inj₁ taut |
| 65 | +Const'→Const (Bool.false , contr) = inj₂ contr |
| 66 | + |
| 67 | +Nonconst : Prop F → Set |
| 68 | +Nonconst p = Satisfiable p × Falsifiable p |
| 69 | + |
| 70 | +Nonconst' : Prop F → Set |
| 71 | +Nonconst' p = negate (Const p) |
| 72 | + |
| 73 | +Nonconst→Nonconst' : ∀ {p} → Nonconst p → Nonconst' p |
| 74 | +Nonconst→Nonconst' {p} (_ , (a , a-makes-false)) (inj₁ taut ) = NonContradiction' p a (taut a) a-makes-false |
| 75 | +Nonconst→Nonconst' {p} ((a , a-makes-true) , _) (inj₂ contr) = NonContradiction' p a a-makes-true (contr a) |
| 76 | + |
| 77 | +sat-∧ˡ : ∀ p q |
| 78 | + → Tautology p |
| 79 | + → Satisfiable q |
| 80 | + → Satisfiable (p ∧ q) |
| 81 | +sat-∧ˡ p q taut-p (a , sat) = a , ( |
| 82 | + eval (p ∧ q) a ≡⟨⟩ |
| 83 | + eval p a Bool.∧ eval q a ≡⟨ cong (Bool._∧ eval q a) (taut-p a) ⟩ |
| 84 | + Bool.true Bool.∧ eval q a ≡⟨⟩ |
| 85 | + eval q a ≡⟨ sat ⟩ |
| 86 | + Bool.true ∎) |
| 87 | + |
| 88 | +sat-∧ʳ : ∀ p q |
| 89 | + → Tautology q |
| 90 | + → Satisfiable p |
| 91 | + → Satisfiable (p ∧ q) |
| 92 | +sat-∧ʳ p q taut-q (a , sat) = a , ( |
| 93 | + eval (p ∧ q) a ≡⟨⟩ |
| 94 | + eval p a Bool.∧ eval q a ≡⟨ cong (eval p a Bool.∧_) (taut-q a) ⟩ |
| 95 | + eval p a Bool.∧ Bool.true ≡⟨ cong (Bool._∧ Bool.true) sat ⟩ |
| 96 | + Bool.true ∎) |
| 97 | + |
| 98 | +fal-∧ˡ : ∀ p q |
| 99 | + → Falsifiable p |
| 100 | + → Falsifiable (p ∧ q) |
| 101 | +fal-∧ˡ p q (a , unsat) = a , ( |
| 102 | + eval (p ∧ q) a ≡⟨⟩ |
| 103 | + eval p a Bool.∧ eval q a ≡⟨ cong (Bool._∧ eval q a) unsat ⟩ |
| 104 | + Bool.false Bool.∧ eval q a ≡⟨ ∧-zeroˡ (eval q a) ⟩ |
| 105 | + Bool.false ∎) |
| 106 | + |
| 107 | +fal-∧ʳ : ∀ p q |
| 108 | + → Falsifiable q |
| 109 | + → Falsifiable (p ∧ q) |
| 110 | +fal-∧ʳ p q (a , unsat) = a , ( |
| 111 | + eval (p ∧ q) a ≡⟨⟩ |
| 112 | + eval p a Bool.∧ eval q a ≡⟨ cong (eval p a Bool.∧_) unsat ⟩ |
| 113 | + eval p a Bool.∧ Bool.false ≡⟨ ∧-zeroʳ (eval p a) ⟩ |
| 114 | + Bool.false ∎) |
| 115 | + |
| 116 | +-- generalize? |
| 117 | +fal-∧-cong : ∀ p q |
| 118 | + → Falsifiable (p ∧ q) |
| 119 | + → Falsifiable (q ∧ p) |
| 120 | +fal-∧-cong p q (a , unsat) rewrite ∧-comm (eval p a) (eval q a) = a , unsat |
| 121 | + |
| 122 | +taut-∧ : ∀ p q |
| 123 | + → Tautology p |
| 124 | + → Tautology q |
| 125 | + → Tautology (p ∧ q) |
| 126 | +taut-∧ p q taut-p taut-q a rewrite taut-p a | taut-q a = refl |
| 127 | + |
| 128 | +contr-∧ˡ : ∀ p q |
| 129 | + → Contradiction p |
| 130 | + → Contradiction (p ∧ q) |
| 131 | +contr-∧ˡ p q contr-p a rewrite contr-p a = refl |
| 132 | + |
| 133 | +contr-∧ʳ : ∀ p q |
| 134 | + → Contradiction q |
| 135 | + → Contradiction (p ∧ q) |
| 136 | +contr-∧ʳ p q contr-q a = |
| 137 | + eval (p ∧ q) a ≡⟨⟩ |
| 138 | + eval p a Bool.∧ eval q a ≡⟨ cong (eval p a Bool.∧_) (contr-q a) ⟩ |
| 139 | + eval p a Bool.∧ Bool.false ≡⟨ ∧-comm (eval p a) Bool.false ⟩ |
| 140 | + Bool.false ∎ |
| 141 | + |
0 commit comments