{-# OPTIONS --safe #-} module Problem23 where open import Data.List open import Data.List.Properties open import Data.Fin using (fromℕ<) open import Data.Fin.Properties using (fromℕ<-cong) open import Data.Empty open import Data.Nat open import Data.Nat.Properties open import Data.Product open import Function open import Relation.Binary.PropositionalEquality open import Relation.Nullary open import Relation.Nullary.Negation open ≡-Reasoning variable State : Set variable f : State → State Assertion : Set → Set₁ Assertion State = State → Set variable ϕ ϕ′ ψ ψ′ π g : Assertion State _∧_ : Assertion State → Assertion State → Assertion State ϕ ∧ ψ = λ σ → ϕ σ × ψ σ ¬'_ : Assertion State → Assertion State ¬' ϕ = λ σ → (ϕ σ → ⊥) _⇒_ : Assertion State → Assertion State → Set ϕ ⇒ ψ = ∀ σ → ϕ σ → ψ σ data Program (State : Set) : Set₁ where SKIP : Program State IF_THEN_ELSE_FI : Assertion State → Program State → Program State → Program State WHILE_DO_OD : Assertion State → Program State → Program State _∶_ : Program State → Program State → Program State UPD : (State → State) → Program State infixl 5 _∶_ variable P Q : Program State data ⟨_⟩_⟨_⟩ {State : Set} : Assertion State → Program State → Assertion State → Set₁ where skipₕ : ⟨ ϕ ⟩ SKIP ⟨ ϕ ⟩ ifₕ : ⟨ ϕ ∧ g ⟩ P ⟨ ψ ⟩ → ⟨ ϕ ∧ (¬' g) ⟩ Q ⟨ ψ ⟩ → ⟨ ϕ ⟩ IF g THEN P ELSE Q FI ⟨ ψ ⟩ whileₕ : ⟨ ϕ ∧ g ⟩ P ⟨ ϕ ⟩ → ⟨ ϕ ⟩ WHILE g DO P OD ⟨ ϕ ∧ (¬' g) ⟩ seqₕ : ⟨ ϕ ⟩ P ⟨ π ⟩ → ⟨ π ⟩ Q ⟨ ψ ⟩ → ⟨ ϕ ⟩ P ∶ Q ⟨ ψ ⟩ updₕ : ⟨ ϕ ∘ f ⟩ UPD f ⟨ ϕ ⟩ conseqₕ : ϕ ⇒ ϕ′ → ⟨ ϕ′ ⟩ P ⟨ ψ′ ⟩ → ψ′ ⇒ ψ → ⟨ ϕ ⟩ P ⟨ ψ ⟩ record ListSum : Set where field A : List ℕ s : ℕ i : ℕ lookup' : List ℕ → ℕ → ℕ lookup' V n with n