Actually force proof of 'analyze-correct'
Signed-off-by: Danila Fedorin <danila.fedorin@gmail.com>
This commit is contained in:
parent
105321971f
commit
9f2790c500
@ -8,6 +8,7 @@ module Analysis.Forward
|
|||||||
{{≈ˡ-dec : IsDecidable _≈ˡ_}} where
|
{{≈ˡ-dec : IsDecidable _≈ˡ_}} where
|
||||||
|
|
||||||
open import Data.Empty using (⊥-elim)
|
open import Data.Empty using (⊥-elim)
|
||||||
|
open import Data.Unit using (⊤)
|
||||||
open import Data.String using (String)
|
open import Data.String using (String)
|
||||||
open import Data.Product using (_,_)
|
open import Data.Product using (_,_)
|
||||||
open import Data.List using (_∷_; []; foldr; foldl)
|
open import Data.List using (_∷_; []; foldr; foldl)
|
||||||
@ -77,7 +78,7 @@ module WithProg (prog : Program) where
|
|||||||
updateAll-k∈ks-≡ {l = sv} (states-complete s) s,vs∈usv
|
updateAll-k∈ks-≡ {l = sv} (states-complete s) s,vs∈usv
|
||||||
|
|
||||||
module WithValidInterpretation {{latticeInterpretationˡ : LatticeInterpretation isLatticeˡ}}
|
module WithValidInterpretation {{latticeInterpretationˡ : LatticeInterpretation isLatticeˡ}}
|
||||||
{{validEvaluator : ValidStmtEvaluator evaluator latticeInterpretationˡ}} where
|
{{validEvaluator : ValidStmtEvaluator evaluator latticeInterpretationˡ}} (dummy : ⊤) where
|
||||||
open ValidStmtEvaluator validEvaluator
|
open ValidStmtEvaluator validEvaluator
|
||||||
|
|
||||||
eval-fold-valid : ∀ {s bss vs ρ₁ ρ₂} → ρ₁ , bss ⇒ᵇˢ ρ₂ → ⟦ vs ⟧ᵛ ρ₁ → ⟦ foldl (flip (eval s)) vs bss ⟧ᵛ ρ₂
|
eval-fold-valid : ∀ {s bss vs ρ₁ ρ₂} → ρ₁ , bss ⇒ᵇˢ ρ₂ → ⟦ vs ⟧ᵛ ρ₁ → ⟦ foldl (flip (eval s)) vs bss ⟧ᵛ ρ₂
|
||||||
|
@ -16,6 +16,7 @@ open import Lattice
|
|||||||
open import Equivalence
|
open import Equivalence
|
||||||
open import Showable using (Showable; show)
|
open import Showable using (Showable; show)
|
||||||
open import Utils using (_⇒_; _∧_; _∨_)
|
open import Utils using (_⇒_; _∧_; _∨_)
|
||||||
|
open import Analysis.Utils using (eval-combine₂)
|
||||||
import Analysis.Forward
|
import Analysis.Forward
|
||||||
|
|
||||||
data Sign : Set where
|
data Sign : Set where
|
||||||
@ -101,6 +102,9 @@ plus [ 0ˢ ]ᵍ [ 0ˢ ]ᵍ = [ 0ˢ ]ᵍ
|
|||||||
postulate plus-Monoˡ : ∀ (s₂ : SignLattice) → Monotonic _≼ᵍ_ _≼ᵍ_ (λ s₁ → plus s₁ s₂)
|
postulate plus-Monoˡ : ∀ (s₂ : SignLattice) → Monotonic _≼ᵍ_ _≼ᵍ_ (λ s₁ → plus s₁ s₂)
|
||||||
postulate plus-Monoʳ : ∀ (s₁ : SignLattice) → Monotonic _≼ᵍ_ _≼ᵍ_ (plus s₁)
|
postulate plus-Monoʳ : ∀ (s₁ : SignLattice) → Monotonic _≼ᵍ_ _≼ᵍ_ (plus s₁)
|
||||||
|
|
||||||
|
plus-Mono₂ : Monotonic₂ _≼ᵍ_ _≼ᵍ_ _≼ᵍ_ plus
|
||||||
|
plus-Mono₂ = (plus-Monoˡ , plus-Monoʳ)
|
||||||
|
|
||||||
minus : SignLattice → SignLattice → SignLattice
|
minus : SignLattice → SignLattice → SignLattice
|
||||||
minus ⊥ᵍ _ = ⊥ᵍ
|
minus ⊥ᵍ _ = ⊥ᵍ
|
||||||
minus _ ⊥ᵍ = ⊥ᵍ
|
minus _ ⊥ᵍ = ⊥ᵍ
|
||||||
@ -119,6 +123,9 @@ minus [ 0ˢ ]ᵍ [ 0ˢ ]ᵍ = [ 0ˢ ]ᵍ
|
|||||||
postulate minus-Monoˡ : ∀ (s₂ : SignLattice) → Monotonic _≼ᵍ_ _≼ᵍ_ (λ s₁ → minus s₁ s₂)
|
postulate minus-Monoˡ : ∀ (s₂ : SignLattice) → Monotonic _≼ᵍ_ _≼ᵍ_ (λ s₁ → minus s₁ s₂)
|
||||||
postulate minus-Monoʳ : ∀ (s₁ : SignLattice) → Monotonic _≼ᵍ_ _≼ᵍ_ (minus s₁)
|
postulate minus-Monoʳ : ∀ (s₁ : SignLattice) → Monotonic _≼ᵍ_ _≼ᵍ_ (minus s₁)
|
||||||
|
|
||||||
|
minus-Mono₂ : Monotonic₂ _≼ᵍ_ _≼ᵍ_ _≼ᵍ_ minus
|
||||||
|
minus-Mono₂ = (minus-Monoˡ , minus-Monoʳ)
|
||||||
|
|
||||||
⟦_⟧ᵍ : SignLattice → Value → Set
|
⟦_⟧ᵍ : SignLattice → Value → Set
|
||||||
⟦_⟧ᵍ ⊥ᵍ _ = ⊥
|
⟦_⟧ᵍ ⊥ᵍ _ = ⊥
|
||||||
⟦_⟧ᵍ ⊤ᵍ _ = ⊤
|
⟦_⟧ᵍ ⊤ᵍ _ = ⊤
|
||||||
@ -195,29 +202,13 @@ module WithProg (prog : Program) where
|
|||||||
|
|
||||||
eval-Monoʳ : ∀ (e : Expr) → Monotonic _≼ᵛ_ _≼ᵍ_ (eval e)
|
eval-Monoʳ : ∀ (e : Expr) → Monotonic _≼ᵛ_ _≼ᵍ_ (eval e)
|
||||||
eval-Monoʳ (e₁ + e₂) {vs₁} {vs₂} vs₁≼vs₂ =
|
eval-Monoʳ (e₁ + e₂) {vs₁} {vs₂} vs₁≼vs₂ =
|
||||||
let
|
eval-combine₂ (λ {x} {y} {z} → ≼ᵍ-trans {x} {y} {z})
|
||||||
-- TODO: can this be done with less boilerplate?
|
plus plus-Mono₂ {o₁ = eval e₁ vs₁}
|
||||||
g₁vs₁ = eval e₁ vs₁
|
(eval-Monoʳ e₁ vs₁≼vs₂) (eval-Monoʳ e₂ vs₁≼vs₂)
|
||||||
g₂vs₁ = eval e₂ vs₁
|
|
||||||
g₁vs₂ = eval e₁ vs₂
|
|
||||||
g₂vs₂ = eval e₂ vs₂
|
|
||||||
in
|
|
||||||
≼ᵍ-trans
|
|
||||||
{plus g₁vs₁ g₂vs₁} {plus g₁vs₂ g₂vs₁} {plus g₁vs₂ g₂vs₂}
|
|
||||||
(plus-Monoˡ g₂vs₁ {g₁vs₁} {g₁vs₂} (eval-Monoʳ e₁ {vs₁} {vs₂} vs₁≼vs₂))
|
|
||||||
(plus-Monoʳ g₁vs₂ {g₂vs₁} {g₂vs₂} (eval-Monoʳ e₂ {vs₁} {vs₂} vs₁≼vs₂))
|
|
||||||
eval-Monoʳ (e₁ - e₂) {vs₁} {vs₂} vs₁≼vs₂ =
|
eval-Monoʳ (e₁ - e₂) {vs₁} {vs₂} vs₁≼vs₂ =
|
||||||
let
|
eval-combine₂ (λ {x} {y} {z} → ≼ᵍ-trans {x} {y} {z})
|
||||||
-- TODO: here too -- can this be done with less boilerplate?
|
minus minus-Mono₂ {o₁ = eval e₁ vs₁}
|
||||||
g₁vs₁ = eval e₁ vs₁
|
(eval-Monoʳ e₁ vs₁≼vs₂) (eval-Monoʳ e₂ vs₁≼vs₂)
|
||||||
g₂vs₁ = eval e₂ vs₁
|
|
||||||
g₁vs₂ = eval e₁ vs₂
|
|
||||||
g₂vs₂ = eval e₂ vs₂
|
|
||||||
in
|
|
||||||
≼ᵍ-trans
|
|
||||||
{minus g₁vs₁ g₂vs₁} {minus g₁vs₂ g₂vs₁} {minus g₁vs₂ g₂vs₂}
|
|
||||||
(minus-Monoˡ g₂vs₁ {g₁vs₁} {g₁vs₂} (eval-Monoʳ e₁ {vs₁} {vs₂} vs₁≼vs₂))
|
|
||||||
(minus-Monoʳ g₁vs₂ {g₂vs₁} {g₂vs₂} (eval-Monoʳ e₂ {vs₁} {vs₂} vs₁≼vs₂))
|
|
||||||
eval-Monoʳ (` k) {vs₁@((kvs₁ , _) , _)} {vs₂@((kvs₂ , _), _)} vs₁≼vs₂
|
eval-Monoʳ (` k) {vs₁@((kvs₁ , _) , _)} {vs₂@((kvs₂ , _), _)} vs₁≼vs₂
|
||||||
with ∈k-decᵛ k kvs₁ | ∈k-decᵛ k kvs₂
|
with ∈k-decᵛ k kvs₁ | ∈k-decᵛ k kvs₂
|
||||||
... | yes k∈kvs₁ | yes k∈kvs₂ =
|
... | yes k∈kvs₁ | yes k∈kvs₂ =
|
||||||
@ -301,4 +292,8 @@ module WithProg (prog : Program) where
|
|||||||
eval-valid (⇒ᵉ-ℕ ρ 0) _ = refl
|
eval-valid (⇒ᵉ-ℕ ρ 0) _ = refl
|
||||||
eval-valid (⇒ᵉ-ℕ ρ (suc n')) _ = (n' , refl)
|
eval-valid (⇒ᵉ-ℕ ρ (suc n')) _ = (n' , refl)
|
||||||
|
|
||||||
analyze-correct = Analysis.Forward.WithProg.analyze-correct
|
instance
|
||||||
|
SignEvalValid : ValidExprEvaluator SignEval latticeInterpretationᵍ
|
||||||
|
SignEvalValid = record { valid = eval-valid }
|
||||||
|
|
||||||
|
analyze-correct = Analysis.Forward.WithProg.analyze-correct SignLattice prog tt
|
||||||
|
Loading…
Reference in New Issue
Block a user