<div dir="ltr"><div>Regarding Irrelevance as an optimization, I think that it is easy to determine it. Correct me if I am wrong.</div><div><br></div><div>Assuming that we perform optimization knowing all the code, definitions and for simplicity that there are no let statements,</div><div>in the Treeless representation , one would identify a variable as unused if it is not used in an application TApp or in TCase.</div><div><br></div><div>The algorithm would remove the specific argument from the function and it will find all the functions that use this function and remove terms that are applied to it at this position.</div><div><br></div><div>The fact that we removed the use of some terms as arguments to an application, gives us new opportunities for optimization.</div><div>We perform the above steps iteratively till no more changes are possible.</div><div><br></div><div>In this algorithm, we also remove terms due to "global" reasons. Computational irrelevance can be introduced in the middle of the algorithm, it would be impossible to know it from the beginning.</div><div><br></div><div>Personally, I am optimistic that it can be done. I haven't though implemented this yet, so I might be wrong in my assumptions.<br></div></div><br><div class="gmail_quote"><div dir="ltr">On Mon, Oct 29, 2018 at 2:32 AM Jon Sterling <<a href="mailto:jon@jonmsterling.com">jon@jonmsterling.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Dear Jesper,<br>
<br>
I feel that these are two separate issues getting conflated -- on the one hand, a compiler may infer that something is irrelevant, and then erase it in order to achieve a more efficient execution. On the other hand, there is proof irrelevance which is used for *semantic* reasons: irrelevance is part of the specification of some function, and whether or not it executes in an irrelevant or erased way is really beside the point (of course, in such a case, the compiler *should* erase it because it is low hanging fruit).<br>
<br>
The latter (semantic) kind of proof irrelevance could be used, for instance, in order to achieve the following things:<br>
<br>
- to specify that some function is parametric in its indices: for instance, operations on vectors<br>
<br>
- relatedly, to force *coherence*: for instance, when defining some interpretation of some language, you can use proof irrelevence + some inversion lemmas to formalize the old pattern (from Streicher) of defining your function by recursion on the labels of the derivation rather than on the derivation itself. In old school math, this required defining a partial function and then establishing that it terminates, but in very fancy type theory we can use proof irrelevance to do this simultaneously and get a total function all at once.<br>
<br>
- and of course, to obtain more definitional equivalences where possible<br>
<br>
Let me unleash a kind of important point: as I mentioned, in all these cases, erasure should obviously be done, but there are cases where a good compiler would perform erasure even when it is not possible to type the term using the irrelevant types. Something might be erasable for global reasons. Anyway, it's not so important to me that Agda catch all of these cases, because I'm not using Agda for executing code (but others might be).<br>
<br>
What I'm saying is that inferring when something is computationally irrelevant must be treated as orthogonal to whether something can be typed with a proof irrelevance modality. Computational irrelevance is a property of code in the compilation target language (which could be anything), not a property of code in the Agda language.<br>
<br>
We should take compilation seriously, and not conflate it with typechecking and elaboration. Dependently typed languages have *two* computational semantics: the one which generates definitional equivalence of terms, and the one which executes.<br>
<br>
Best,<br>
Jon<br>
<br>
<br>
<br>
<br>
On Sun, Oct 28, 2018, at 2:01 PM, Jesper Cockx wrote:<br>
> Hi Agda people,<br>
> <br>
> In the comments on issue #3334<br>
> <<a href="https://github.com/agda/agda/issues/3334#issuecomment-433730080" rel="noreferrer" target="_blank">https://github.com/agda/agda/issues/3334#issuecomment-433730080</a>>, Wolfram<br>
> wrote:<br>
> <br>
> I consider it counterproductive to be able to declare irreleveance, and<br>
> > even more counterproductive to have to do it for efficiency reasons,<br>
> > because that encourages premature optimisations. The compiler (including<br>
> > the type checker) should detect it whenever possible, and optimise it away<br>
> > as soon as possible.<br>
> <br>
> <br>
> To which I replied:<br>
> <br>
> Often the fact that a certain term is irrelevant is obvious to *you* as the<br>
> > Agda programmer but there's no way for Agda to figure this out from the<br>
> > code. If it's possible that you will use the term at any point in the<br>
> > future, Agda cannot (and should not) erase it. So any automatic detection<br>
> > of irrelevance would probably be very disappointing. (The alternative where<br>
> > Agda would eagerly erase things without asking and then complaining later<br>
> > when you try to use them is arguably worse). Another advantage of<br>
> > annotating irrelevant things, is that Agda can warn you when you use it<br>
> > accidentally in a non-erased position, instead of removing the irrelevance<br>
> > silently and causing hard-to-explain performance regressions.<br>
> ><br>
> <br>
> But I realized this is based mostly on speculation and not hard facts.<br>
> Historically, Agda has focused on the annotated style of proof-irrelevance<br>
> (Andreas' irrelevant functions and irrelevant fields, and more recently my<br>
> implementation of Prop). Maybe inferred proof irrelevance would work better<br>
> than expected?<br>
> <br>
> So now my question to *you*, the Agda community is this: do you prefer<br>
> Agda's current style of annotated proof-irrelevance, or would you rather<br>
> have Agda infer things for you (and perhaps fail to do so in some cases)?<br>
> <br>
> I won't promise I will remove Prop and focus all my attention on inferring<br>
> irrelevance even if everyone votes for the latter option, but it would be<br>
> interesting to know going forward what you think.<br>
> <br>
> -- Jesper<br>
> _______________________________________________<br>
> Agda mailing list<br>
> <a href="mailto:Agda@lists.chalmers.se" target="_blank">Agda@lists.chalmers.se</a><br>
> <a href="https://lists.chalmers.se/mailman/listinfo/agda" rel="noreferrer" target="_blank">https://lists.chalmers.se/mailman/listinfo/agda</a><br>
_______________________________________________<br>
Agda mailing list<br>
<a href="mailto:Agda@lists.chalmers.se" target="_blank">Agda@lists.chalmers.se</a><br>
<a href="https://lists.chalmers.se/mailman/listinfo/agda" rel="noreferrer" target="_blank">https://lists.chalmers.se/mailman/listinfo/agda</a><br>
</blockquote></div>