-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsolver.agda
97 lines (79 loc) · 3.38 KB
/
solver.agda
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
module solver where
import Relation.Binary.PropositionalEquality as Eq
open Eq using (_≡_; refl; cong)
open import Data.Nat using (ℕ; zero; suc)
open import Data.Nat.Properties using (+-comm; +-identityʳ)
open import Data.Bool renaming (not to ¬♭_; _∨_ to _∨♭_; _∧_ to _∧♭_)
open import Data.Vec using (Vec; _∷_; []; [_]; lookup)
open import Data.Nat
open import Data.Maybe
open import Agda.Builtin.Int
open import Agda.Builtin.Nat
open import Data.Product
open import Data.List.Base
open import Function.Base using (case_of_; case_return_of_)
open import Data.List.Base
open import Data.Bool.Base using (not)
open import Data.Product using (_×_; ∃; ∃-syntax)
open import Data.Fin
infixl 4 _∨_
infixl 4 _∧_
infixl 6 ¬_
data Formula : (n : ℕ) → Set where
var_ : {m : ℕ} → (n : Fin m) → Formula m
¬_ : {m : ℕ} → Formula m → Formula m
_∨_ : {m : ℕ} → Formula m → Formula m → Formula m
_∧_ : {m : ℕ} → Formula m → Formula m → Formula m
data VBool : (n : ℕ) → Set where
VR : {m : ℕ} → (n : Fin m) -> VBool m
VT : {m : ℕ} → VBool m
VF : {m : ℕ} → VBool m
_+++_ : {m : ℕ} → VBool m → VBool m → VBool m
(VR m) +++ (VR y) = VR m
VT +++ b = b
b +++ VF = VF
b +++ VT = b
VF +++ b = VF
_//_ : {m : ℕ} → VBool m → VBool m → VBool m
VR x // VR y = VR x
VT // b = VT
b // VT = VT
VF // b = b
b // VF = b
neg : {m : ℕ} → VBool m → VBool m
neg (VR x) = VR x
neg VT = VF
neg VF = VT
transformVBool : {m : ℕ} → Bool -> VBool m
transformVBool true = VT
transformVBool false = VF
searchFor : {m : ℕ} → Fin m → List (Fin m × Bool) -> VBool m
searchFor a [] = VR a
searchFor a (y ∷ ys) = case (toℕ a ≡ᵇ toℕ (proj₁ y)) of λ
{ true -> (transformVBool(proj₂ y));
false -> (searchFor a ys)
}
extr : {m : ℕ} → List ((Fin m × Bool) × Bool) -> List (Fin m × Bool)
extr (x ∷ xs) = ((proj₁ x) ∷ extr xs)
extr [] = []
eval : {m : ℕ} → Formula m → List (Fin m × Bool) → VBool m
eval (var b) y = searchFor b y
eval (x ∧ y) j = eval x j +++ eval y j
eval (x ∨ y) j = eval x j // eval y j
eval (¬ x) y = neg (eval x y)
backtr :{m : ℕ} → List ((Fin m × Bool) × Bool) → Maybe (List ((Fin m × Bool) × Bool))
backtr (((n , b) , false) ∷ xs) = (just (((n , (not b)) , true) ∷ xs))
backtr (((x , b) , true) ∷ xs) = backtr xs
backtr [] = nothing
{-# NON_TERMINATING #-}
auxSolve :{m : ℕ} → List ((Fin m × Bool) × Bool) -> Formula m -> Maybe (List (Fin m × Bool))
auxSolve x phi = case (eval phi (extr x)) of λ
{(VR n) -> auxSolve(((n , true) , false) ∷ x) phi;
VT -> just (extr x);
VF -> case backtr x of λ
{(just n) -> auxSolve n phi;
nothing -> nothing
}
}
solve :{m : ℕ} → Formula m → Maybe (List (Fin m × Bool))
solve z = auxSolve [] z