|
| 1 | +import BoltLean.Helpers |
| 2 | + |
| 3 | +structure Trace (n_pred : Nat) where |
| 4 | + pos_n_pred : n_pred > 0 |
| 5 | + predicates : List (Vector Bool n_pred) |
| 6 | +deriving Repr |
| 7 | + |
| 8 | +/-- LTL Formulas in NNF -/ |
| 9 | +inductive Formula n_pred |
| 10 | + | True : Formula n_pred |
| 11 | + | False : Formula n_pred |
| 12 | + | Var : Fin n_pred -> (neg: Bool) -> Formula n_pred -- neg: Whether the variable is negated |
| 13 | + | Next : Formula n_pred -> Formula n_pred |
| 14 | + | WeakNext : Formula n_pred -> Formula n_pred |
| 15 | + | Globally : Formula n_pred -> Formula n_pred |
| 16 | + | Finally : Formula n_pred -> Formula n_pred |
| 17 | + | Or : Formula n_pred -> Formula n_pred -> Formula n_pred |
| 18 | + | And : Formula n_pred -> Formula n_pred -> Formula n_pred |
| 19 | + | Until : Formula n_pred -> Formula n_pred -> Formula n_pred |
| 20 | +deriving DecidableEq |
| 21 | + |
| 22 | +namespace Formula |
| 23 | + |
| 24 | + def eval_aux (phi: Formula n) (predicates: List (Vector Bool n)): Prop := |
| 25 | + match predicates with |
| 26 | + | .nil => match phi with |
| 27 | + | True | Globally _ => _root_.True |
| 28 | + | False | Finally _ | Var _ _ | Next _ | WeakNext _ | Until _ _ => _root_.False |
| 29 | + | Or psi1 psi2 => (eval_aux psi1 predicates) ∨ (eval_aux psi2 predicates) |
| 30 | + | And psi1 psi2 => (eval_aux psi1 predicates) ∧ (eval_aux psi2 predicates) |
| 31 | + | head::tail => match phi with |
| 32 | + | True => _root_.True |
| 33 | + | False => _root_.False |
| 34 | + | Var v neg => xor head[v] neg |
| 35 | + | Next psi => eval_aux psi tail |
| 36 | + | WeakNext psi => tail = List.nil ∨ eval_aux psi tail |
| 37 | + | Globally psi => ∀ j, j < predicates.length → eval_aux psi (predicates.drop j) |
| 38 | + | Finally psi => ∃ j, j < predicates.length ∧ eval_aux psi (predicates.drop j) |
| 39 | + | Or psi1 psi2 => (eval_aux psi1 predicates) ∨ (eval_aux psi2 predicates) |
| 40 | + | And psi1 psi2 => (eval_aux psi1 predicates) ∧ (eval_aux psi2 predicates) |
| 41 | + | Until psi1 psi2 => ∃ j, j < predicates.length ∧ |
| 42 | + (eval_aux psi2 (predicates.drop j)) ∧ |
| 43 | + (∀ k, k < j → eval_aux psi1 (predicates.drop k)) |
| 44 | + |
| 45 | + def eval (phi : Formula n) (t : Trace n) : Prop := |
| 46 | + eval_aux phi t.predicates |
| 47 | + |
| 48 | + def equivalence (phi psi : Formula n) : Prop := ∀ (t : Trace n), eval phi t ↔ eval psi t |
| 49 | + |
| 50 | + theorem eval2eval_aux (phi1 phi2 : Formula n) (hn : n > 0): (equivalence phi1 phi2) ↔ ∀ l : List (Vector Bool n), (eval_aux phi1 l) ↔ (eval_aux phi2 l) := by |
| 51 | + constructor |
| 52 | + . intro h |
| 53 | + intro l |
| 54 | + unfold equivalence at h |
| 55 | + have h1 := h ⟨hn, l⟩ |
| 56 | + unfold eval at h1 |
| 57 | + simp at h1 |
| 58 | + exact h1 |
| 59 | + . intro h |
| 60 | + unfold equivalence |
| 61 | + intro t |
| 62 | + unfold eval |
| 63 | + exact h t.predicates |
| 64 | + |
| 65 | + theorem congruence_finally (phi1 phi2 : Formula n) : |
| 66 | + (equivalence phi1 phi2) → equivalence (Finally phi1) (Finally phi2) := by |
| 67 | + unfold equivalence |
| 68 | + intro h1 h2 |
| 69 | + rw eval2eval_aux at h1 |
| 70 | + unfold eval at h1 |
| 71 | + unfold eval |
| 72 | + unfold eval_aux |
| 73 | + simp |
| 74 | + match h2.predicates with |
| 75 | + | List.nil => simp |
| 76 | + | head::tail => simp |
| 77 | + constructor |
| 78 | + . intro h |
| 79 | + constructor |
| 80 | + |
| 81 | + |
| 82 | + theorem congruence (phi1 psi1 phi2 psi2 : Formula n) : |
| 83 | + (equivalence phi1 phi2) → (equivalence psi1 psi2) → equivalence (Until phi1 psi1) (Until phi2 psi2) := by |
| 84 | + unfold equivalence |
| 85 | + intro h1 h2 |
| 86 | + sorry |
| 87 | + |
| 88 | + |
| 89 | + |
| 90 | + theorem simplification_rule (phi : Formula n) : equivalence (Finally (Finally phi)) (Finally phi) := by sorry |
| 91 | + |
| 92 | + |
| 93 | + -- theorem or_eval (phi psi: Formula n) (t: Trace n): |
| 94 | + -- (phi.Or psi).eval t ↔ phi.eval t ∨ psi.eval t := by |
| 95 | + -- constructor |
| 96 | + -- . intro h |
| 97 | + -- simp [eval, eval_aux] at h |
| 98 | + -- by_cases htl: 0 < t.length |
| 99 | + -- . simp [htl] at h |
| 100 | + -- unfold eval |
| 101 | + -- simp [htl] |
| 102 | + -- exact h |
| 103 | + -- . simp [htl] at h |
| 104 | + -- assumption |
| 105 | + -- . intro h |
| 106 | + -- rw [eval] |
| 107 | + -- by_cases htl: 0 < t.length |
| 108 | + -- all_goals simp [htl] |
| 109 | + -- . unfold eval at h |
| 110 | + -- simp [htl] at h |
| 111 | + -- rw [eval_aux] |
| 112 | + -- assumption |
| 113 | + -- . exact h |
| 114 | + |
| 115 | + |
| 116 | + -- theorem and_eval (phi psi: Formula n) (t: Trace n): |
| 117 | + -- (phi.And psi).eval t ↔ phi.eval t ∧ psi.eval t := by |
| 118 | + -- constructor |
| 119 | + -- . intro h |
| 120 | + -- simp [eval, eval_aux] at h |
| 121 | + -- by_cases htl: 0 < t.length |
| 122 | + -- . simp [htl] at h |
| 123 | + -- unfold eval |
| 124 | + -- simp [htl] |
| 125 | + -- exact h |
| 126 | + -- . simp [htl] at h |
| 127 | + -- assumption |
| 128 | + -- . intro h |
| 129 | + -- rw [eval] |
| 130 | + -- by_cases htl: 0 < t.length |
| 131 | + -- all_goals simp [htl] |
| 132 | + -- . unfold eval at h |
| 133 | + -- simp [htl] at h |
| 134 | + -- rw [eval_aux] |
| 135 | + -- assumption |
| 136 | + -- . exact h |
| 137 | + |
| 138 | + |
| 139 | +end Formula |
0 commit comments