Skip to content

Commit 8ec8114

Browse files
alternative LTL
1 parent 6f26a10 commit 8ec8114

1 file changed

Lines changed: 139 additions & 0 deletions

File tree

BoltLean/Ltl-alt.lean

Lines changed: 139 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,139 @@
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

Comments
 (0)