<div dir="ltr"><div><div><div><div><div><div><div><div><div><div>A little more analysis from my part. The injectivity rule in the EDPM paper has the following form (somewhat simplified):<br><br></div>m : s ≃ t -&gt; P ⊢ injectivity m : c s ≃ c t -&gt; P<br>


<br></div>
where ≃ is Conor&#39;s heterogeneous equality. As we all know, the elimination rule for heterogeneous equality is equivalent with K, so we should use the homogeneous equality instead:<br><br>m : s ≡ t -&gt; P ⊢ injectivity m : c s ≡ c t -&gt; P<br>

<br></div>Unfortunately, this turns out to be insufficient for pattern matching. What we need instead is a version of injectivity where P is dependent on the proof of c s ≡ c t:<br>

<br>m : (e : s ≡ t) -&gt; P (cong c e) ⊢ injectivity m : (e : c s ≡ c t) -&gt; P e<br><br></div>This works fine as long as the type of c is just a simple data type. When we consider indexed data types, we can no longer be sure that the equation c s ≡ c t is homogeneous. So an additional equation on the indices is introduced, and P is made dependent on it as well. So suppose for simplicity &quot;D : U -&gt; Set&quot; is a data type with a single constructor &quot;c : (x : A) -&gt; D (u x)&quot; and define &quot;us := u s&quot; and &quot;ut := u t&quot;. We need this auxiliary function:<br>

<br>conf : (e : s ≡ t) → subst D (cong u e) (c s) ≡ c t<br>conf e = J (λ t e → subst D (cong u e) (c s) ≡ c t) e refl<br><br>Then we get the correct version of injectivity:<br>
<br></div>m : (e : s ≡ t) -&gt; P (cong u e) (conf e) ⊢ injectivity m : (eu : us ≡ ut) (e : subst D eu (c s) ≡ c t) -&gt; P eu e<br><br></div>This rule can be defined using only the standard eliminators for D and ≡, without K (ask me if you want to see the construction, I have it but it&#39;s quite long). <br>

<br>However, this is not the form of injectivity that is used in the pattern matching algorithm. Rather, it needs a version of injectivity where us and ut are *definitionally* equal. Ok, you say, in that case we can just fill in refl to get this:<br>

<br>m : (e : s ≡ t) -&gt; P (cong u e) (conf e) ⊢ injectivity m : (e : c s ≡ c t) -&gt; P refl e<br><br></div>The problem arises when we want to apply this rule to construct a function &quot;? : (e : c s ≡ c t) -&gt; P&#39; e&quot;. Now in order to apply this rule, we need to find P such that P refl e = P&#39; e (definitionally). In other words, to construct P we need to eliminate the first argument &quot;eu : u ≡ u&quot;, which is generally speaking not possible without K.<br>

<br></div>In my example, I exploit this behaviour by choosing &quot;P&#39; : foo ≡ foo -&gt; Set&quot; to be defined by &quot;P&#39; e = e ≡ refl&quot;. You can see that we cannot construct a &quot;P : (e : refl ≡ refl) -&gt; subst Foo e foo ≡ foo -&gt; Set&quot; such that &quot;P refl e ≡ P&#39; refl&quot; without using K. So we should not be able to apply injectivity in this situation, yet that is exactly what Agda is doing.<br>

<br></div>Best,<br></div>Jesper<br><div><div><div><div>
<div><div>
<div><br></div></div></div></div></div></div></div></div><div class="gmail_extra"><br><br><div class="gmail_quote">On Fri, Jan 17, 2014 at 3:34 PM, Jesper Cockx <span dir="ltr">&lt;<a href="mailto:Jesper@sikanda.be" target="_blank">Jesper@sikanda.be</a>&gt;</span> wrote:<br>

<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div><div><div><div><span style="font-family:arial,helvetica,sans-serif">Andreas: my own version of --without-K has the same problem. However, I&#39;m trying to fix it by doing something like parameter reconstruction for the indices: when applying the injectivity rule to the problem &quot;foo ≡ foo&quot;, we should first solve the equation &quot;refl ≡ refl&quot; on the indices (here, both refl&#39;s have type &quot;myPoint ≡ myPoint&quot;). But this equation is already rejected by the current --without-K, thus excluding the problematic pattern matching on &quot;foo ≡ foo&quot;. I&#39;m still testing whether this doesn&#39;t introduce any other problems or excludes any good examples.</span><br>


<br></div>Matteo: the problem with allowing no pattern matching at all is that in Agda, we depend on pattern matching to define eliminators for data types. Another possibility would be to introduce an even more restrictive version of --without-K that requires all indices (and parameters too possibly?) to be *distinct* variables (so no constructors allowed). This would at least allow us to define the eliminator for each data type, but hopefully be simple enough to avoid any problems like this one.<br>


<br></div>Mattieu: The equation that&#39;s being eliminated is &quot;foo ≡ foo&quot;, which is indeed the same as &quot;refl ≡ refl&quot; under the equivalence Foo-equiv. However unlike refl, the constructor foo has no parameters and no arguments, so a naive interpretation of injectivity would tell you that the only term of type &quot;foo ≡ foo&quot; is refl. However, this is ignoring the index of the type Foo. So in fact, we first need to solve the equation &quot;refl ≡ refl&quot; on the indices, which is impossible without K. <br>


<br></div>Best,<br></div>Jesper<br></div><div class="HOEnZb"><div class="h5"><div class="gmail_extra"><br><br><div class="gmail_quote">On Fri, Jan 17, 2014 at 3:02 PM, Matteo Acerbi <span dir="ltr">&lt;<a href="mailto:matteo.acerbi@gmail.com" target="_blank">matteo.acerbi@gmail.com</a>&gt;</span> wrote:<br>


<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hello,<br>
<br>
I noticed that if the two postulates are replaced by<br>
<br>
module _ (mySpace : Set)(myPoint : mySpace) where<br>
<br>
(indent the rest)<br>
<br>
the problem seems to not appear (an error is reported).<br>
<br>
Maybe this gives some hints (I do not know).<br>
<br>
That said, I have a small proposal.<br>
<br>
Most of the times I use Agda for its *wonderful* dependent pattern<br>
matching facility, but every now and then I would like to forbid<br>
myself to use pattern matching at all, at least from inside a single<br>
file.<br>
<br>
I would like to have the possibility to get back to that file and make<br>
sure that I never used pattern matching in that code just by looking<br>
at the OPTIONS header.<br>
<br>
I think I would find a --no-pattern-matching option, which simply<br>
applied this restriction, but still allowed for importing modules<br>
whatever their options are, very convenient.<br>
<br>
For now I am just curious as to whether others are interested: would<br>
anyone else like such a --no-pattern-matching option?<br>
<br>
Cheers,<br>
Matteo<br>
<div><div><br>
On Fri, Jan 17, 2014 at 2:43 PM, Jesper Cockx &lt;<a href="mailto:Jesper@sikanda.be" target="_blank">Jesper@sikanda.be</a>&gt; wrote:<br>
&gt; I&#39;m not relieved. The problem is still there.<br>
&gt;<br>
&gt;<br>
&gt; On Fri, Jan 17, 2014 at 2:38 PM, Andreas Abel &lt;<a href="mailto:andreas.abel@ifi.lmu.de" target="_blank">andreas.abel@ifi.lmu.de</a>&gt;<br>
&gt; wrote:<br>
&gt;&gt;<br>
&gt;&gt; Can you explain, please?<br>
&gt;&gt;<br>
&gt;&gt; You say you did not expect to be able to prove &#39;problem&#39; from<br>
&gt;&gt; &#39;equiv-to-id&#39; which you thought was univalence.  Martin tells you that<br>
&gt;&gt; &#39;equiv-to-id&#39; is a consequence of univalence.  Now you are relieved. But<br>
&gt;&gt; still &#39;problem&#39; follows from univalence.  Why are you relieved now?<br>
&gt;&gt;<br>
&gt;&gt; Sorry, I am a bit confused now...<br>
&gt;&gt; Andreas<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt; On 17.01.2014 13:39, Jesper Cockx wrote:<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; As Martin pointed out to me, my definition of equiv-to-id is not the<br>
&gt;&gt;&gt; univalence axiom, but merely a (much weaker) consequence of it. Thank<br>
&gt;&gt;&gt; you.<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; Best,<br>
&gt;&gt;&gt; Jesper<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; On Fri, Jan 17, 2014 at 12:19 PM, Jesper Cockx &lt;<a href="mailto:Jesper@sikanda.be" target="_blank">Jesper@sikanda.be</a><br>
&gt;&gt;&gt; &lt;mailto:<a href="mailto:Jesper@sikanda.be" target="_blank">Jesper@sikanda.be</a>&gt;&gt; wrote:<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt;     Dear all,<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt;     Much to my own surprise, I encountered another problem with the<br>
&gt;&gt;&gt;     --without-K option. This is on the latest darcs version of Agda and<br>
&gt;&gt;&gt;     is unrelated to the termination checker. As far as I understand, the<br>
&gt;&gt;&gt;     unification algorithm is applying the injectivity rule too liberally<br>
&gt;&gt;&gt;     for data types indexed over indexed data. But maybe someone else can<br>
&gt;&gt;&gt;     give a better explanation?<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt;     === BEGIN CODE ===<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt;     {-# OPTIONS --without-K #-}<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt;     module YetAnotherWithoutKProblem where<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt;     -- First, some preliminaries to make this file self-contained.<br>
&gt;&gt;&gt;     data _≡_ {a} {A : Set a} (x : A) : A → Set where<br>
&gt;&gt;&gt;        refl : x ≡ x<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt;     subst : ∀ {a b} {A : Set a} {x : A} (B : (y : A) → Set b) →<br>
&gt;&gt;&gt;              {y : A} → x ≡ y → B x → B y<br>
&gt;&gt;&gt;     subst B refl b = b<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt;     record _≃_ (A B : Set) : Set where<br>
&gt;&gt;&gt;        constructor equiv<br>
&gt;&gt;&gt;        field<br>
&gt;&gt;&gt;          f : A → B<br>
&gt;&gt;&gt;          g : B → A<br>
&gt;&gt;&gt;          i : (x : A) → g (f x) ≡ x<br>
&gt;&gt;&gt;          j : (y : B) → f (g y) ≡ y<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt;     -- The univalence axiom.<br>
&gt;&gt;&gt;     postulate equiv-to-id : {A B : Set} → A ≃ B → A ≡ B<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt;     -- Now consider any concrete space &#39;mySpace&#39; with a point &#39;myPoint&#39;.<br>
&gt;&gt;&gt;     -- We will show that mySpace has no structure above dimension 2.<br>
&gt;&gt;&gt;     postulate mySpace : Set<br>
&gt;&gt;&gt;     postulate myPoint : mySpace<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt;     -- We define Foo in a way such that &#39;Foo e&#39; is equivalent with &#39;refl<br>
&gt;&gt;&gt;     ≡ e&#39;.<br>
&gt;&gt;&gt;     data Foo : myPoint ≡ myPoint → Set where<br>
&gt;&gt;&gt;        foo : Foo refl<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt;     Foo-equiv : {e : myPoint ≡ myPoint} → Foo e ≃ (refl ≡ e)<br>
&gt;&gt;&gt;     Foo-equiv = equiv f g i j<br>
&gt;&gt;&gt;        where<br>
&gt;&gt;&gt;          f : {e : myPoint ≡ myPoint} → Foo e → refl ≡ e<br>
&gt;&gt;&gt;          f foo = refl<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt;          g : {e : myPoint ≡ myPoint} → refl ≡ e → Foo e<br>
&gt;&gt;&gt;          g refl = foo<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt;          i : {e : myPoint ≡ myPoint} (m : Foo e) → g (f m) ≡ m<br>
&gt;&gt;&gt;          i foo = refl<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt;          j : {e : myPoint ≡ myPoint} (i : refl ≡ e) → f (g i) ≡ i<br>
&gt;&gt;&gt;          j refl = refl<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt;     -- Here comes the real problem: by injectivity, &#39;Foo e&#39; is a set ...<br>
&gt;&gt;&gt;     test : {e : myPoint ≡ myPoint} → (a : Foo e) → (i : a ≡ a) → i ≡ refl<br>
&gt;&gt;&gt;     test foo refl = refl<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt;     -- ... hence by univalence, so is &#39;refl ≡ e&#39;.<br>
&gt;&gt;&gt;     problem : {e : myPoint ≡ myPoint} → (a : refl ≡ e) → (i : a ≡ a) → i<br>
&gt;&gt;&gt;     ≡ refl<br>
&gt;&gt;&gt;     problem = subst (λ X → (x : X) → (i : x ≡ x) → i ≡ refl)<br>
&gt;&gt;&gt;                      (equiv-to-id Foo-equiv)<br>
&gt;&gt;&gt;                      test<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt;     === END CODE ===<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt;     All the best,<br>
&gt;&gt;&gt;     Jesper<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; _______________________________________________<br>
&gt;&gt;&gt; Agda mailing list<br>
&gt;&gt;&gt; <a href="mailto:Agda@lists.chalmers.se" target="_blank">Agda@lists.chalmers.se</a><br>
&gt;&gt;&gt; <a href="https://lists.chalmers.se/mailman/listinfo/agda" target="_blank">https://lists.chalmers.se/mailman/listinfo/agda</a><br>
&gt;&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt; --<br>
&gt;&gt; Andreas Abel  &lt;&gt;&lt;      Du bist der geliebte Mensch.<br>
&gt;&gt;<br>
&gt;&gt; Theoretical Computer Science, University of Munich<br>
&gt;&gt; Oettingenstr. 67, D-80538 Munich, GERMANY<br>
&gt;&gt;<br>
&gt;&gt; <a href="mailto:andreas.abel@ifi.lmu.de" target="_blank">andreas.abel@ifi.lmu.de</a><br>
&gt;&gt; <a href="http://www2.tcs.ifi.lmu.de/~abel/" target="_blank">http://www2.tcs.ifi.lmu.de/~abel/</a><br>
&gt;<br>
&gt;<br>
&gt;<br>
&gt; _______________________________________________<br>
&gt; Agda mailing list<br>
&gt; <a href="mailto:Agda@lists.chalmers.se" target="_blank">Agda@lists.chalmers.se</a><br>
&gt; <a href="https://lists.chalmers.se/mailman/listinfo/agda" target="_blank">https://lists.chalmers.se/mailman/listinfo/agda</a><br>
&gt;<br>
</div></div></blockquote></div><br></div>
</div></div></blockquote></div><br></div>