_∼_
_∼_
_≈_
_≈_
_≈_
→ _∼_
_≈_
_∼_
→ _≈_
_≈_
_≈_
_≈_
data
module Revise.Reflection where
open import Data.Nat using (ℕ; _+_; suc; zero; _≤_; s≤s; z≤n; _≟_) open import Data.Vec using (Vec; []; _∷_; tail; head) open import Data.Empty using (⊥) open import Data.Unit using (⊤; tt) open import Data.Product using (Σ; _×_; _,_; proj₁; proj₂) open import Data.Sum using (_⊎_; inj₁; inj₂) open import Function renaming (_∘_ to _∘f_) open import Relation.Nullary using (Dec; yes; no) open import Relation.Binary.Core using (Decidable) open import Relation.Binary.PropositionalEquality using (_≡_; refl; trans; cong)
ex : {A : Set} → (A → Set) → Set ex = Σ _ syntax ex (λ y → x) = y ∣ x
_∼_
module _ {A : Set} where private V = Vec A infix 1 _~_ infixl 3 _∘_ data _~_ : ∀ {n} → V n → V n → Set where zero : [] ~ [] suc : ∀ {n a} {xs ys : V n} → xs ~ ys → a ∷ xs ~ a ∷ ys _∘_ : ∀ {n} {xs ys zs : V n} → xs ~ ys → ys ~ zs → xs ~ zs exch : ∀ {n a b} {xs : V n} → a ∷ b ∷ xs ~ b ∷ a ∷ xs
_∼_
~-refl : ∀ {n} {xs : V n} → xs ~ xs ~-refl {xs = []} = zero ~-refl {xs = _ ∷ []} = suc zero ~-refl {xs = _ ∷ _ ∷ xs} = exch ∘ exch ~-sym : ∀ {n} {xs ys : V n} → xs ~ ys → ys ~ xs ~-sym zero = zero ~-sym (suc e) = suc (~-sym e) ~-sym (e ∘ e₁) = ~-sym e₁ ∘ ~-sym e ~-sym exch = exch
_∘simp_ : ∀ {n} {xs ys zs : V n} → xs ~ ys → ys ~ zs → xs ~ zs zero ∘simp a = a suc zero ∘simp a = a (exch ∘ exch) ∘simp a = a a ∘simp (exch ∘ exch) = a a ∘simp b = a ∘ b
sucSimp : ∀ {n x} {xs ys : V n} → xs ~ ys → x ∷ xs ~ x ∷ ys sucSimp zero = suc zero sucSimp (suc zero) = exch ∘ exch sucSimp (exch ∘ exch) = exch ∘ exch sucSimp x = suc x
_≈_
infix 1 _≋_ _≈_ infixr 3 _↪_ data Into (n : ℕ) : Set where _↪_ : A → V n → Into n data _≋_ : ∀ {n} → Into n → V (suc n) → Set where zero : ∀ {n x} {xs : V n} → x ↪ xs ≋ x ∷ xs suc : ∀ {n x y} {xs : V n} {ys} → x ↪ xs ≋ ys → x ↪ y ∷ xs ≋ y ∷ ys data _≈_ : ∀ {n} → V n → V n → Set where [] : [] ≈ [] _∷_ : ∀ {n x} {xs ys : V n} {xxs} → x ↪ xs ≋ xxs → ys ≈ xs → x ∷ ys ≈ xxs
_≈_
≈-refl : ∀ {n} {xs : V n} → xs ≈ xs ≈-refl {xs = []} = [] ≈-refl {xs = _ ∷ _} = zero ∷ ≈-refl
_≈_
→ _∼_
~↪ : ∀ {n x} {xs : V n} {ys} → x ↪ xs ≋ ys → x ∷ xs ~ ys ~↪ zero = ~-refl ~↪ (suc e) = exch ∘simp sucSimp (~↪ e) ≈→~ : ∀ {n} {xs ys : V n} → xs ≈ ys → xs ~ ys ≈→~ [] = zero ≈→~ (x ∷ e) = sucSimp (≈→~ e) ∘simp ~↪ x
_≈_
↪-exch : ∀ {n x y} {xs : V n} {xxs yxxs} → x ↪ xs ≋ xxs → y ↪ xxs ≋ yxxs → yxs ∣ (y ↪ xs ≋ yxs) × (x ↪ yxs ≋ yxxs) ↪-exch zero zero = _ , zero , suc zero ↪-exch zero (suc b) = _ , b , zero ↪-exch (suc a) zero = _ , zero , suc (suc a) ↪-exch (suc a) (suc b) with ↪-exch a b ... | _ , s , t = _ , suc s , suc t getOut : ∀ {n x} {xs : V n} {xxs xys} → x ↪ xs ≋ xxs → xxs ≈ xys → ys ∣ (x ↪ ys ≋ xys) × (xs ≈ ys) getOut zero (x₁ ∷ b) = _ , x₁ , b getOut (suc a) (x₁ ∷ b) with getOut a b ... | (l , m , f) with ↪-exch m x₁ ... | s , k , r = s , r , k ∷ f infixl 3 _∘≈_ _∘≈_ : ∀ {n} {xs ys zs : V n} → xs ≈ ys → ys ≈ zs → xs ≈ zs [] ∘≈ f = f x₁ ∷ e ∘≈ f with getOut x₁ f ... | a , b , c = b ∷ (e ∘≈ c)
_∼_
→ _≈_
~→≈ : ∀ {n} {xs ys : V n} → xs ~ ys → xs ≈ ys ~→≈ zero = [] ~→≈ (suc e) = zero ∷ ~→≈ e ~→≈ (e ∘ e₁) = ~→≈ e ∘≈ ~→≈ e₁ ~→≈ exch = suc zero ∷ zero ∷ ≈-refl
_≈_
≈-sym : ∀ {n} {xs ys : V n} → xs ≈ ys → ys ≈ xs ≈-sym a = ~→≈ (~-sym (≈→~ a))
_≈_
cancel : ∀ {n} {x} {xs ys : V n} → x ∷ xs ≈ x ∷ ys → xs ≈ ys cancel (zero ∷ e) = e cancel (suc x₁ ∷ b ∷ e) = zero ∷ e ∘≈ b ∷ ≈-refl ∘≈ x₁ ∷ ≈-refl
t1 : 1 ∷ 2 ∷ 3 ∷ 4 ∷ [] ≈ 3 ∷ 2 ∷ 4 ∷ 1 ∷ [] t1 = suc (suc (suc zero)) ∷ suc zero ∷ zero ∷ zero ∷ []
f2 : 1 ∷ 2 ∷ [] ≈ 1 ∷ 1 ∷ [] → ⊥ f2 (zero ∷ () ∷ []) f2 (suc x ∷ () ∷ [])
_≈_
module Dec≈ (A : Set) {{eq : Decidable {A = A} _≡_}} where private V = Vec A
getOut' : ∀ {n} x (xs : V (suc n)) → Dec (ys ∣ x ↪ ys ≋ xs) getOut' x (x₁ ∷ xs) with eq x x₁ getOut' .x₁ (x₁ ∷ xs) | yes refl = yes (xs , zero) getOut' x (x₁ ∷ []) | no ¬p = no (¬p ∘f f x refl) where f : ∀ a → x ≡ a → (ys ∣ a ↪ ys ≋ x₁ ∷ []) → x ≡ x₁ f .x₁ k (.[] , zero) = k getOut' x (x₁ ∷ y ∷ xs) | no ¬p with getOut' x (y ∷ xs) ... | yes (a , b) = yes (x₁ ∷ a , suc b) ... | no ¬q = no (f x refl) where f : ∀ a → x ≡ a → (ys ∣ a ↪ ys ≋ x₁ ∷ y ∷ xs) → ⊥ f .x₁ e (.(y ∷ xs) , zero) = ¬p e f a e (.x₁ ∷ xs , suc q) with a | e ... | .x | refl = ¬q (xs , q)
infix 2 _≈?_ _≈?_ : ∀ {n} → (xs ys : V n) → Dec (xs ≈ ys) [] ≈? [] = yes [] x ∷ xs ≈? ys with getOut' x ys ... | no ¬p = no λ { (h ∷ _) → ¬p (_ , h)} ... | yes (zs , p) with xs ≈? zs ... | yes p' = yes (p ∷ p') ... | no ¬p = no λ e → ¬p (cancel (e ∘≈ ≈-sym (p ∷ ≈-refl)))
open Dec≈ ℕ {{_≟_}} -- TODO: remove this try = 1 ∷ 20 ∷ 3 ∷ 4 ∷ [] ≈? 3 ∷ 2 ∷ 4 ∷ 1 ∷ []
open import Reflection hiding (_≟_) open import Data.List using ([]; _∷_) open import Data.Maybe using (Maybe; just; nothing; maybe′)
parseℕ : Term → Maybe ℕ parseℕ (con c []) with c ≟-Name quote ℕ.zero ... | yes _ = just 0 ... | _ = nothing parseℕ (con c (arg _ x ∷ [])) with c ≟-Name quote ℕ.suc | parseℕ x ... | yes _ | just n = just (suc n) ... | _ | _ = nothing parseℕ _ = nothing
parseℕ′ : Term → ℕ parseℕ′ t = maybe′ id 0 (parseℕ t)
data Side : Set where side : ∀ {n} → Vec ℕ n → Side
parseSide : Term → Maybe Side parseSide (con c []) = just (side []) parseSide (con c (_ ∷ arg _ x ∷ arg _ xs ∷ [])) with parseSide xs | parseℕ x ... | just (side s) | just n = just (side (n ∷ s)) ... | _ | _ = nothing parseSide _ = nothing
data Solution : Set where ok : ∀ {n} {xs ys : Vec ℕ n} → Dec (xs ≈ ys) → Solution error : ℕ → Solution
computeSolution : Term → Term → Solution computeSolution l r with parseSide l | parseSide r ... | nothing | _ = error 0 ... | _ | nothing = error 1 ... | just (side {a} b) | just (side {a'} d) with a ≟ a' computeSolution l r | just (side b) | just (side d) | yes refl = ok (b ≈? d) ... | no ¬p = error 2
data
This simplifies parsing of a negation.
data Neg (A : Set) : Set where neg : (A → ⊥) → Neg A
err : ℕ → Σ Set id err n = (n ≡ n) , refl
parse : Term → Σ Set id parse (def c (A ∷ n ∷ arg _ l ∷ arg _ r ∷ [])) with c ≟-Name quote _≈_ ... | yes _ = ⟦ computeSolution l r ⟧ where ⟦_⟧ : Solution → Σ Set id ⟦ ok (yes d) ⟧ = _ , d ⟦ error n ⟧ = err n ⟦ _ ⟧ = err 10 ... | no _ with c ≟-Name quote _~_ ... | yes _ = ⟦ computeSolution l r ⟧ where ⟦_⟧ : Solution → Σ Set id ⟦ ok (yes d) ⟧ = _ , ≈→~ d ⟦ error n ⟧ = err n ⟦ _ ⟧ = err 15 ... | no _ = err 13 parse (def c' (arg _ (def c (A ∷ n ∷ arg _ l ∷ arg _ r ∷ [])) ∷ [])) with c' ≟-Name quote Neg ... | yes _ = ⟦ computeSolution l r ⟧ where ⟦_⟧ : Solution → Σ Set id ⟦ ok (no d) ⟧ = _ , neg d ⟦ error n ⟧ = err n ⟦ _ ⟧ = err 11 ... | no _ = err 12 parse _ = err 3
solvePerm : (g : Term) → proj₁ (parse g) solvePerm g = proj₂ (parse g)
{- todo x : 1 ∷ 2 ∷ 2 ∷ 4 ∷ 5 ∷ [] ≈ 2 ∷ 2 ∷ 1 ∷ 4 ∷ 5 ∷ [] x = quoteGoal t in solvePerm t x1 : 1 ∷ 2 ∷ 3 ∷ 4 ∷ 5 ∷ [] ~ 1 ∷ 2 ∷ 3 ∷ 4 ∷ 5 ∷ [] x1 = quoteGoal t in solvePerm t x2 : 1 ∷ 2 ∷ 2 ∷ 4 ∷ 5 ∷ [] ~ 2 ∷ 2 ∷ 1 ∷ 4 ∷ 5 ∷ [] x2 = quoteGoal t in solvePerm t x3 : 1 ∷ 2 ∷ 2 ∷ 4 ∷ 6 ∷ 7 ∷ 8 ∷ 1 ∷ 5 ∷ [] ~ 2 ∷ 8 ∷ 1 ∷ 6 ∷ 7 ∷ 2 ∷ 1 ∷ 4 ∷ 5 ∷ [] x3 = quoteGoal t in solvePerm t x' : Neg (1 ∷ 2 ∷ 2 ∷ 4 ∷ 5 ∷ [] ≈ 2 ∷ 12 ∷ 1 ∷ 4 ∷ 5 ∷ []) x' = quoteGoal t in solvePerm t -}
x