[Agda] `with' --> `case' fails

Andreas Abel andreas.abel at ifi.lmu.de
Fri Sep 27 20:24:05 CEST 2013


The full code would be helpful to answer your question. --Andreas

On 26.09.2013 13:29, Sergei Meshveliani wrote:
> Please how to rewrite the `with' program to the `case' one in the below
> example?
>
> The `with' variant has repetitions (of the  pp∙x=x∙pp  implementation
> and others) in the two `with' branches. These unpleasant repetitions
> must (as I think) disappear in the `case' version.
>
> The `with' version is type-cheked.
> But my `case' version (obtained by the most natural conversion) is not.
> The report is
>
>    /home/mechvel/doconA/0.03/source/AlgClasses1.agda:382,39-56
>    x != pow cnt x hf suc>0 of type C
>    when checking that the expression <x∙pp>∙x=x∙<x∙pp> has type
>    (p ∙ p) ∙ x ≈ x ∙ (p ∙ p)
>
> The code is not full.
> I can provide the full one -- if the below is not sufficient to tell.
>
> Thank you in advance for explanation,
>
> ------
> Sergei
>
>
>
> ---------------------------------------------------------------------------
> module Power α α= (upSemig : UpSemigroup α α=)
>    where
>    semig = UpSemigroup.semigroup upSemig
>    open Semigroup semig
>             using (setoid; _≈_; _∙_; ∙assoc; ∙cong₁; ∙cong₂)
>             renaming (Carrier to C; isEquivalence to ≈equiv)
>    open IsEquivalence ≈equiv using ()
>                              renaming (refl to ≈refl; sym to ≈sym)
>    open DecTotalOrder natDTO using () renaming (trans to ≤trans)
>
>    open module EqR-setoid = EqR setoid renaming (_≈⟨_⟩_ to _≈[_]_)
>    open _≤_
>
>    pow : ℕ → C → (e : ℕ) → e > 0 → C
>                                -- Power  x  to  e  (return  x^e)
>                                -- by the binary method
>    pow 0         x  _            _  = x
>    pow _         x  0            ()
>    pow _         x (suc 0)       _  = x
>    pow (suc cnt) x (suc (suc e)) _  = case  even? e  of \
>                                       { (yes _) → p ∙ p
>                                       ; _       → x ∙ (p ∙ p) }
>                                       where
>                                       hf = suc (half e)
>                                       p  = pow cnt x hf suc>0
>
>    -----------------------------------------------------------
>    comm-with-power :
>                (cnt : ℕ) → (x : C) → (e : ℕ) → (e>0 : e > 0) →
>                (pow cnt x e e>0) ∙ x ≈ x ∙ (pow cnt x e e>0)
>
>    -- Prove  x ∙ x^e ≈ x^e ∙ x.
>
>    comm-with-power 0         x e             _     =  ≈refl
>    comm-with-power _         x 0             ()
>    comm-with-power (suc _)   x (suc 0)       _     =  ≈refl
>    comm-with-power (suc cnt) x (suc (suc e)) e''>0
>
>      with  even? e
>
>      ... | yes _ = pp∙x=x∙pp
>          where
>          hf    = suc (half e)
>          p     = pow cnt x hf suc>0
>          px=xp = comm-with-power cnt x hf suc>0
>
>          pp∙x=x∙pp : (p ∙ p) ∙ x ≈ x ∙ (p ∙ p)
>          pp∙x=x∙pp =
>               begin  (p ∙ p) ∙ x   ≈[ ∙assoc p p x ]
>                      p ∙ (p ∙ x)   ≈[ ∙cong₂ px=xp ]
>                      p ∙ (x ∙ p)   ≈[ ≈sym $ ∙assoc p x p ]
>                      (p ∙ x) ∙ p   ≈[ ∙cong₁ px=xp ]
>                      (x ∙ p) ∙ p   ≈[ ∙assoc x p p ]
>                      x ∙ (p ∙ p)
>>
>      ... | no _ = <x∙pp>∙x=x∙<x∙pp>
>          where
>          half-e = half e
>          hf     = suc half-e
>          p      = pow cnt x hf suc>0
>          pp     = p ∙ p
>          px=xp  = comm-with-power cnt x hf (suc>0 {half-e})
>
>          pp∙x=x∙pp =
>               begin  (p ∙ p) ∙ x   ≈[ ∙assoc p p x ]
>                      p ∙ (p ∙ x)   ≈[ ∙cong₂ px=xp ]
>                      p ∙ (x ∙ p)   ≈[ ≈sym $ ∙assoc p x p ]
>                      (p ∙ x) ∙ p   ≈[ ∙cong₁ px=xp ]
>                      (x ∙ p) ∙ p   ≈[ ∙assoc x p p ]
>                      x ∙ (p ∙ p)
>>          <x∙pp>∙x=x∙<x∙pp> : (x ∙ pp) ∙ x ≈ x ∙ (x ∙ pp)
>          <x∙pp>∙x=x∙<x∙pp> =
>                 begin  (x ∙ pp) ∙ x   ≈[ ∙assoc x pp x ]
>                        x ∙ (pp ∙ x)   ≈[ ∙cong₂ pp∙x=x∙pp ]
>                        x ∙ (x ∙ pp)
>>
> {- The `case' version -- to replace the last segment of  `with'  :
>
>      = case even? e of \ { (yes _) → pp∙x=x∙pp
>                          ; (no _)  → <x∙pp>∙x=x∙<x∙pp> }
>      where
>      hf    = suc (half e)
>      p     = pow cnt x hf suc>0
>      pp    = p ∙ p
>      px=xp = comm-with-power cnt x hf suc>0
>
>      pp∙x=x∙pp : (p ∙ p) ∙ x ≈ x ∙ (p ∙ p)
>      pp∙x=x∙pp =
>           begin  (p ∙ p) ∙ x   ≈[ ∙assoc p p x ]
>                  p ∙ (p ∙ x)   ≈[ ∙cong₂ px=xp ]
>                  p ∙ (x ∙ p)   ≈[ ≈sym $ ∙assoc p x p ]
>                  (p ∙ x) ∙ p   ≈[ ∙cong₁ px=xp ]
>                  (x ∙ p) ∙ p   ≈[ ∙assoc x p p ]
>                  x ∙ (p ∙ p)
>>      <x∙pp>∙x=x∙<x∙pp> : (x ∙ pp) ∙ x ≈ x ∙ (x ∙ pp)
>      <x∙pp>∙x=x∙<x∙pp> =
>           begin  (x ∙ pp) ∙ x   ≈[ ∙assoc x pp x ]
>                  x ∙ (pp ∙ x)   ≈[ ∙cong₂ pp∙x=x∙pp ]
>                  x ∙ (x ∙ pp)
>> -}
>
>
>
>
>
> _______________________________________________
> Agda mailing list
> Agda at lists.chalmers.se
> https://lists.chalmers.se/mailman/listinfo/agda
>


-- 
Andreas Abel  <><      Du bist der geliebte Mensch.

Theoretical Computer Science, University of Munich
Oettingenstr. 67, D-80538 Munich, GERMANY

andreas.abel at ifi.lmu.de
http://www2.tcs.ifi.lmu.de/~abel/


More information about the Agda mailing list