<div dir="ltr"><div>Sergei,<br><br></div>It might be helpful if you posted full code examples using <a href="http://lpaste.net">lpaste.net</a>. It has a nice syntax highlighting and is easier to extract to a file than copy / paste from email.<br><br><blockquote style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex" class="gmail_quote">And I need to find out what is `inspect&#39;.<br></blockquote><div><br></div><div>&quot;inspect&quot; can be found living in Relation.Binary.Propositional equality, and is a nifty little trick to remember that a with term <font face="monospace,monospace">w<font face="arial,helvetica,sans-serif"> was originally equal to <span style="font-family:monospace,monospace">f x</span>.</font></font> Here&#39;s an example:<br><br><a href="http://lpaste.net/117700">http://lpaste.net/117700</a><br><br></div><div>When proving <br><pre><span class="">filter</span><span class="">-</span><span class="">All</span> <span class="">:</span> <span class=""> ∀ {A : Set} → (p : A → Bool) → (xs : List A) → <br>             All (λ x → p x ≡ true) (filter p xs)<br></span></pre><pre><span class=""><font face="arial,helvetica,sans-serif">After doing analysis on <span style="font-family:monospace,monospace">xs</span> and moving to a cons case, we find we need to analyze <span style="font-family:monospace,monospace">p x</span> in order to continue.<br><br><span style="font-family:monospace,monospace">filter-All p (x ∷ xs) = {!!}<br>--Goal: All (λ x₁ → p x₁ ≡ true) (if p x then x ∷ filter p xs else filter p xs)</span><br></font></span></pre><pre><span class=""><font face="arial,helvetica,sans-serif">However after we get to the true case and are ready to construct an element of <span style="font-family:monospace,monospace">All</span> with <span style="font-family:monospace,monospace">_</span></font></span><span style="font-family:monospace,monospace"><span class="">∷_<font face="arial,helvetica,sans-serif">, Agda seems to have forgotten why we were <br>here in first place!<br><br></font></span><span class="">filter-All p (x ∷ xs) with p x<br>filter-All p (x ∷ xs) | true = {!!} ∷ (filter-All p xs)<br>-- Goal: p x ≡ true<br></span></span></pre><pre><span style="font-family:monospace,monospace"><span class=""><font face="arial,helvetica,sans-serif">We can use inspect to remind Agda.<br><br><font face="monospace,monospace">filter-All p (x ∷ xs) with p x | inspect p x<br>filter-All p (x ∷ xs) | true | Reveal_is_.[ eq ] = eq ∷ (filter-All p xs)</font><br></font></span></span></pre><pre><span style="font-family:monospace,monospace"><span class=""><font face="arial,helvetica,sans-serif"></font></span></span></pre></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Sat, Jan 3, 2015 at 7:19 AM, Sergei Meshveliani <span dir="ltr">&lt;<a href="mailto:mechvel@botik.ru" target="_blank">mechvel@botik.ru</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class="">On Fri, 2015-01-02 at 20:47 +0100, Andrea Vezzosi wrote:<br>
&gt; Only one match wasn&#39;t enough, but inspect and rewrite help to keep the<br>
&gt; code short anyway :)<br>
&gt;<br>
<br>
</span>This looks good!<br>
Thank you very much.<br>
And I need to find out what is `inspect&#39;.<br>
<br>
------<br>
Sergei<br>
<div class="HOEnZb"><div class="h5"><br>
<br>
&gt;   ins-kv∘ins-ku-eq _    k _ _ []   _  with k ≟ k<br>
&gt;   ...                                     | yes _  =  =pn-refl<br>
&gt;   ...                                     | no k≉k =  ⊥-elim $ k≉k ≈refl<br>
&gt;<br>
&gt;   ins-kv∘ins-ku-eq comb k u v ((k&#39; , w) ∷ ps) sym-assoc-comb = prove<br>
&gt;     where<br>
&gt;     ins  = insertWithKey comb<br>
&gt;     kv   = (k , v)<br>
&gt;     ku   = (k , u)<br>
&gt;     k&#39;w  = (k&#39; , w)<br>
&gt;     ckuw = comb k u w<br>
&gt;     ckvu = comb k v u<br>
&gt;<br>
&gt;     prove : ins kv (ins ku (k&#39;w ∷ ps)) =pn ins (k , comb k v u) (k&#39;w ∷ ps)<br>
&gt;     prove with k ≟ k&#39; | PE.inspect (_≟_ k) k&#39;<br>
&gt;     prove     | yes p | PE.[ eq ] rewrite eq = e0 ∷pn =pn-refl<br>
&gt;       where<br>
&gt;       e0 : (k&#39; , comb k v ckuw) =p (k&#39; , comb k ckvu w)<br>
&gt;       e0 = (≈refl , sym-assoc-comb)<br>
&gt;<br>
&gt;     prove     | no ¬p | PE.[ eq ] rewrite eq = =p-refl ∷pn e0<br>
&gt;       where<br>
&gt;       e0 : (ins kv (ins ku ps)) =pn (ins (k , ckvu) ps)<br>
&gt;       e0 = ins-kv∘ins-ku-eq comb k u v ps sym-assoc-comb<br>
&gt;<br>
&gt; Cheers,<br>
&gt; Andrea<br>
&gt;<br>
&gt; On Fri, Jan 2, 2015 at 8:15 PM, Sergei Meshveliani &lt;<a href="mailto:mechvel@botik.ru">mechvel@botik.ru</a>&gt; wrote:<br>
&gt; &gt;<br>
&gt; &gt; On Fri, 2015-01-02 at 16:51 +0100, Andrea Vezzosi wrote:<br>
&gt; &gt;&gt; It&#39;s really hard to see what&#39;s going on without being able to load the<br>
&gt; &gt;&gt; code, and with a lot of it omitted.<br>
&gt; &gt;&gt;<br>
&gt; &gt;&gt; We need at least the definition of &quot;ins&quot; and the original type of<br>
&gt; &gt;&gt; &quot;foo&quot;, then we might be able to figure out a better type for the two<br>
&gt; &gt;&gt; alternatives, so that the splitting on (k ≟ k&#39;) only needs to be done<br>
&gt; &gt;&gt; once.<br>
&gt; &gt;&gt;<br>
&gt; &gt;<br>
&gt; &gt; Here follows the full code. It occurs small.<br>
&gt; &gt;<br>
&gt; &gt; I am grateful to anyone who shows how to write<br>
&gt; &gt;                                          ins-kv∘ins-ku-eq<br>
&gt; &gt; in a nicer way.<br>
&gt; &gt;<br>
&gt; &gt; ------<br>
&gt; &gt; Sergei<br>
&gt; &gt;<br>
&gt; &gt;<br>
&gt; &gt;<br>
&gt; &gt; --**********************************************************************<br>
&gt; &gt; module AssocList where<br>
&gt; &gt; open import Level    using (Level)<br>
&gt; &gt; open import Function using (_$_; case_of_)<br>
&gt; &gt; open import Relation.Nullary using (¬_; Dec; yes; no)<br>
&gt; &gt; open import Relation.Unary   using (Decidable)<br>
&gt; &gt; open import Relation.Binary  using<br>
&gt; &gt;      (Rel; _⇒_; Reflexive; Symmetric; Transitive; IsEquivalence;<br>
&gt; &gt;       module IsEquivalence; Setoid; module Setoid; module DecSetoid;<br>
&gt; &gt;       DecSetoid<br>
&gt; &gt;      )<br>
&gt; &gt; open import Relation.Binary.PropositionalEquality as PE using (_≡_)<br>
&gt; &gt; import Relation.Binary.EqReasoning as EqR<br>
&gt; &gt; open import Data.Empty   using (⊥; ⊥-elim)<br>
&gt; &gt; open import Data.Product using (_×_;  _,_)<br>
&gt; &gt; open import Relation.Binary.Product.Pointwise using (_×-setoid_)<br>
&gt; &gt; open import Data.List using (List; []; _∷_)<br>
&gt; &gt; open import Relation.Binary.List.Pointwise as Pointwise using ()<br>
&gt; &gt;                                    renaming ([] to []pn; _∷_ to _∷pn_)<br>
&gt; &gt;<br>
&gt; &gt; -----------------------------------------------------------------------<br>
&gt; &gt; module _ {α α= β β= : Level} (keyDSetoid : DecSetoid α α=)<br>
&gt; &gt;                              (valSetoid  : Setoid β β=)<br>
&gt; &gt;   where<br>
&gt; &gt;   open DecSetoid keyDSetoid using (_≈_; _≟_; setoid) renaming<br>
&gt; &gt;                                 (Carrier to K; isEquivalence to kEquiv)<br>
&gt; &gt;   open IsEquivalence kEquiv using ()<br>
&gt; &gt;                 renaming (refl to ≈refl; sym to ≈sym; trans to ≈trans)<br>
&gt; &gt;<br>
&gt; &gt;   open Setoid valSetoid using () renaming (Carrier to V; _≈_ to _=v_;<br>
&gt; &gt;                                                isEquivalence to vEquiv)<br>
&gt; &gt;   open IsEquivalence vEquiv using ()<br>
&gt; &gt;            renaming (refl to =v-refl; sym to =v-sym; trans to =v-trans;<br>
&gt; &gt;                                              reflexive to =v-reflexive)<br>
&gt; &gt;<br>
&gt; &gt;   pairSetoid = setoid ×-setoid valSetoid                  -- for  K × V<br>
&gt; &gt;   open Setoid pairSetoid using () renaming (Carrier to KV; _≈_ to _=p_;<br>
&gt; &gt;                                               isEquivalence to pEquiv)<br>
&gt; &gt;   open IsEquivalence pEquiv using ()<br>
&gt; &gt;           renaming (refl to =p-refl; sym to =p-sym; trans to =p-trans;<br>
&gt; &gt;                                              reflexive to =p-reflexive)<br>
&gt; &gt;<br>
&gt; &gt;   point-p-setoid = Pointwise.setoid pairSetoid<br>
&gt; &gt;   open Setoid point-p-setoid using ()<br>
&gt; &gt;                       renaming (_≈_ to _=pn_; isEquivalence to pnEquiv)<br>
&gt; &gt;   -- &quot;pn&quot; stands for &quot;pointwise for List KV&quot;<br>
&gt; &gt;<br>
&gt; &gt;   open IsEquivalence pnEquiv using ()<br>
&gt; &gt;                renaming (refl to =pn-refl; reflexive to =pn-reflexive;<br>
&gt; &gt;                                                  sym to =pn-sym)<br>
&gt; &gt;   open module EqR-pn = EqR point-p-setoid<br>
&gt; &gt;       renaming (begin_ to begin-pn_; _∎ to _end-pn; _≈⟨_⟩_ to _=pn[_]_)<br>
&gt; &gt;<br>
&gt; &gt;<br>
&gt; &gt;   -------------------------------------------------------------------<br>
&gt; &gt;   Pairs : Set _<br>
&gt; &gt;   Pairs = List KV<br>
&gt; &gt;<br>
&gt; &gt;   CombineKVV : Set _  -- (α ⊔ β)<br>
&gt; &gt;   CombineKVV = K → V → V → V<br>
&gt; &gt;<br>
&gt; &gt;   ----------------------------------------------------------------------<br>
&gt; &gt;   insertWithKey : CombineKVV →  KV → Pairs → Pairs<br>
&gt; &gt;                -- \key newV oldV |→ resV<br>
&gt; &gt;<br>
&gt; &gt;   insertWithKey _    p         []                =  p ∷ []<br>
&gt; &gt;   insertWithKey comb (k , new) ((k&#39; , old) ∷ ps) =<br>
&gt; &gt;         case k ≟ k&#39;<br>
&gt; &gt;         of \<br>
&gt; &gt;         { (yes _) → (k&#39; , comb k new old) ∷ ps<br>
&gt; &gt;         ; (no _)  → (k&#39; , old) ∷ (insertWithKey comb (k , new) ps) }<br>
&gt; &gt;<br>
&gt; &gt;   ----------------------------------------------------------------------<br>
&gt; &gt;   ins-kv∘ins-ku-eq :<br>
&gt; &gt;              (comb : CombineKVV) → ∀ k u v ps →<br>
&gt; &gt;              (∀ {w} → comb k v (comb k u w) =v comb k (comb k v u) w) →<br>
&gt; &gt;              let ins = insertWithKey comb<br>
&gt; &gt;              in<br>
&gt; &gt;              ins (k , v) (ins (k , u) ps)  =pn  ins (k , comb k v u) ps<br>
&gt; &gt;<br>
&gt; &gt;   -- Example:  it fits  comb _ u v = f u v   with any Associative f.<br>
&gt; &gt;<br>
&gt; &gt;   ins-kv∘ins-ku-eq _    k _ _ []   _  with k ≟ k<br>
&gt; &gt;   ...                                     | yes _  =  =pn-refl<br>
&gt; &gt;   ...                                     | no k≉k =  ⊥-elim $ k≉k ≈refl<br>
&gt; &gt;<br>
&gt; &gt;   ins-kv∘ins-ku-eq comb k u v ((k&#39; , w) ∷ ps) sym-assoc-comb =<br>
&gt; &gt;                                                         prove (k ≟ k&#39;)<br>
&gt; &gt;     where<br>
&gt; &gt;     ins  = insertWithKey comb<br>
&gt; &gt;     kv   = (k , v)<br>
&gt; &gt;     ku   = (k , u)<br>
&gt; &gt;     k&#39;w  = (k&#39; , w)<br>
&gt; &gt;     ckuw = comb k u w<br>
&gt; &gt;     ckvu = comb k v u<br>
&gt; &gt;<br>
&gt; &gt;     -------------------------------------------------------------------<br>
&gt; &gt;     case≈ : k ≈ k&#39; →<br>
&gt; &gt;             ins kv (ins ku (k&#39;w ∷ ps)) =pn ins (k , ckvu) (k&#39;w ∷ ps)<br>
&gt; &gt;<br>
&gt; &gt;     case≈ k≈k&#39; =<br>
&gt; &gt;       begin-pn<br>
&gt; &gt;         ins kv (ins ku (k&#39;w ∷ ps))   =pn[ =pn-reflexive $<br>
&gt; &gt;                                           PE.cong (ins kv) e1<br>
&gt; &gt;                                         ]<br>
&gt; &gt;         ins kv ((k&#39; , ckuw) ∷ ps)    =pn[ =pn-reflexive e2 ]<br>
&gt; &gt;         (k&#39; , comb k v ckuw) ∷ ps    =pn[ e0 ∷pn =pn-refl ]<br>
&gt; &gt;         (k&#39; , comb k ckvu w) ∷ ps    =pn[ =pn-reflexive $ PE.sym e3 ]<br>
&gt; &gt;         ins (k , ckvu) (k&#39;w ∷ ps)<br>
&gt; &gt;       end-pn<br>
&gt; &gt;       where<br>
&gt; &gt;       e0 : (k&#39; , comb k v ckuw) =p (k&#39; , comb k ckvu w)<br>
&gt; &gt;       e0 = (≈refl , sym-assoc-comb)<br>
&gt; &gt;<br>
&gt; &gt;       e1 :  ins ku ((k&#39; , w) ∷ ps) ≡ (k&#39; , ckuw) ∷ ps<br>
&gt; &gt;       e1 with k ≟ k&#39;<br>
&gt; &gt;       ... | yes _   = PE.refl<br>
&gt; &gt;       ... | no k≉k&#39; = ⊥-elim $ k≉k&#39; k≈k&#39;<br>
&gt; &gt;<br>
&gt; &gt;       e2 :  ins kv ((k&#39; , ckuw) ∷ ps) ≡ (k&#39; , comb k v ckuw) ∷ ps<br>
&gt; &gt;       e2 with k ≟ k&#39;<br>
&gt; &gt;       ... | yes _   = PE.refl<br>
&gt; &gt;       ... | no k≉k&#39; = ⊥-elim $ k≉k&#39; k≈k&#39;<br>
&gt; &gt;<br>
&gt; &gt;       e3 :  ins (k , ckvu) (k&#39;w ∷ ps) ≡ (k&#39; , comb k ckvu w) ∷ ps<br>
&gt; &gt;       e3 with k ≟ k&#39;<br>
&gt; &gt;       ... | yes _   = PE.refl<br>
&gt; &gt;       ... | no k≉k&#39; = ⊥-elim $ k≉k&#39; k≈k&#39;<br>
&gt; &gt;<br>
&gt; &gt;     -------------------------------------------------------------------<br>
&gt; &gt;     case≉ : ¬ k ≈ k&#39; →<br>
&gt; &gt;             ins kv (ins ku (k&#39;w ∷ ps))  =pn  ins (k , ckvu) (k&#39;w ∷ ps)<br>
&gt; &gt;<br>
&gt; &gt;     case≉ k≉k&#39; =<br>
&gt; &gt;       begin-pn<br>
&gt; &gt;         ins kv (ins ku (k&#39;w ∷ ps))      =pn[ =pn-reflexive $<br>
&gt; &gt;                                               PE.cong (ins kv) e1 ]<br>
&gt; &gt;          ins kv (k&#39;w ∷ (ins ku ps))     =pn[ =pn-reflexive e2 ]<br>
&gt; &gt;          k&#39;w ∷ (ins kv $ ins ku ps)     =pn[ =p-refl ∷pn e0 ]<br>
&gt; &gt;          k&#39;w ∷ (ins (k , ckvu) ps)      =pn[ =pn-reflexive e3 ]<br>
&gt; &gt;          ins (k , ckvu) (k&#39;w ∷ ps)<br>
&gt; &gt;       end-pn<br>
&gt; &gt;       where<br>
&gt; &gt;       e0 : (ins kv (ins ku ps)) =pn (ins (k , ckvu) ps)<br>
&gt; &gt;       e0 = ins-kv∘ins-ku-eq comb k u v ps sym-assoc-comb<br>
&gt; &gt;<br>
&gt; &gt;       e1 : ins ku (k&#39;w ∷ ps) ≡ k&#39;w ∷ (ins ku ps)<br>
&gt; &gt;       e1 with k ≟ k&#39;<br>
&gt; &gt;       ... | no _     = PE.refl<br>
&gt; &gt;       ... | yes k≈k&#39; = ⊥-elim $ k≉k&#39; k≈k&#39;<br>
&gt; &gt;<br>
&gt; &gt;       e2 : ins kv (k&#39;w ∷ ins ku ps) ≡ k&#39;w ∷ (ins kv $ ins ku ps)<br>
&gt; &gt;       e2 with k ≟ k&#39;<br>
&gt; &gt;       ... | no _     = PE.refl<br>
&gt; &gt;       ... | yes k≈k&#39; = ⊥-elim $ k≉k&#39; k≈k&#39;<br>
&gt; &gt;<br>
&gt; &gt;       e3 :  k&#39;w ∷ (ins (k , ckvu) ps) ≡ ins (k , ckvu) (k&#39;w ∷ ps)<br>
&gt; &gt;       e3 with k ≟ k&#39;<br>
&gt; &gt;       ... | no _     = PE.refl<br>
&gt; &gt;       ... | yes k≈k&#39; = ⊥-elim $ k≉k&#39; k≈k&#39;<br>
&gt; &gt;<br>
&gt; &gt;     -----------------------------------------------------------------<br>
&gt; &gt;     prove : Dec (k ≈ k&#39;) → ins kv (ins ku (k&#39;w ∷ ps)) =pn<br>
&gt; &gt;                            ins (k , comb k v u) (k&#39;w ∷ ps)<br>
&gt; &gt;     prove (no k≉k&#39;)  = case≉ k≉k&#39;<br>
&gt; &gt;     prove (yes k≈k&#39;) = case≈ k≈k&#39;<br>
&gt; &gt;<br>
&gt; &gt; -------------------------------------------------------------------------------<br>
&gt; &gt;<br>
&gt; &gt;<br>
&gt; &gt;<br>
&gt; &gt;<br>
&gt;<br>
<br>
<br>
_______________________________________________<br>
Agda mailing list<br>
<a href="mailto:Agda@lists.chalmers.se">Agda@lists.chalmers.se</a><br>
<a href="https://lists.chalmers.se/mailman/listinfo/agda" target="_blank">https://lists.chalmers.se/mailman/listinfo/agda</a><br>
</div></div></blockquote></div><br><br clear="all"><br>-- <br><div class="gmail_signature"><div dir="ltr"><div>Christopher Jenkins<br>Computer Science 2013<br>Trinity University</div></div></div>
</div>