<div dir="auto"><div dir="auto">> Which bottlenecks are you referring to? Are they intrinsically tied to dependent types, or they are related to the treatment of propositions and equality in systems such as Coq?</div><div dir="auto"><br></div><div dir="auto">The main bottleneck that I'm referring to here (though not the only one of my thesis) is the one that is due to the fact that arbitrary conversion problems can happen during typechecking.  This is used to great advantage in proof by reflection (where all of the work is done in checking that a proof of "true = true" has the type "some-check = true").  But it also causes performance issues if you're not careful.</div><div dir="auto">To take a toy example, consider two different definitions of factorial: n! = n * (n - 1)!, and n! = (n - 1)! * n.  Suppose you have two different ways of computing a vector (length-indexed list) of permutations, one which defines the length in terms of the first factorial, and the other one which defines the length in terms of the second factorial.  Suppose you now try to prove that the two methods give the same result on any concrete list of length of length 10.  Just to check that this goal is valid, Coq is now trying to compute 10! as a natural number.  This example is a bit contrived, but less egregious versions of this issue abound, and when doing verified engineering at scale, these issues can add up in hard-to-predict ways.  I have a real-world example where changing the input size just a little bit caused `reflexivity` to take over 400 hours, rather than just a couple of minutes.</div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Tue, Mar 3, 2020, 16:00 Viktor Kunčak <<a href="mailto:vkuncak@gmail.com" target="_blank" rel="noreferrer">vkuncak@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div dir="ltr"><div class="gmail_default" style="font-family:monospace,monospace;font-size:small">I would be also curious to hear answers to this questions!</div><div class="gmail_default" style="font-family:monospace,monospace;font-size:small">("Lots of people do it" seems like a very compelling answer.)</div><div class="gmail_default" style="font-family:monospace,monospace;font-size:small"><br></div><div class="gmail_default" style="font-family:monospace,monospace;font-size:small">Which bottlenecks are you referring to? Are they intrinsically tied to dependent types, or they are related to the treatment of propositions and equality in systems such as Coq?<br></div><div class="gmail_default" style="font-family:monospace,monospace;font-size:small"></div><div class="gmail_default" style="font-family:monospace,monospace;font-size:small"><br></div><div class="gmail_default" style="font-family:monospace,monospace;font-size:small">There are type systems overlayed on top of initially untyped languages (e.g. the language of Alloy Analyzer) and there are gradual types and designs like TypeScript for to initially untyped programming languages. ACL2 theorem prover for pure LISP, SPASS theorem prover for first-order logic, and "<cite><span>TLA+ model checking made symbolic</span></cite>" model checker for TLA+ all include techniques to recover types from an initially untyped language.</div><div class="gmail_default" style="font-family:monospace,monospace;font-size:small"><br></div><div class="gmail_default" style="font-family:monospace,monospace;font-size:small">Best regards,<br></div><div class="gmail_default" style="font-family:monospace,monospace;font-size:small"><br></div><div class="gmail_default" style="font-family:monospace,monospace;font-size:small">  Viktor<br></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Tue, Mar 3, 2020 at 8:44 PM Jason Gross <<a href="mailto:jasongross9@gmail.com" rel="noreferrer noreferrer" target="_blank">jasongross9@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr">I'm in the process of writing my thesis on proof assistant performance bottlenecks (with a focus on Coq), and there's a large class of performance bottlenecks that come from (mis)using the power of dependent types.  So in writing the introduction, I want to provide some justification for the design decision of using dependent types, rather than, say, set theory or classical logic (as in, e.g., Isabelle/HOL).  And the only reasons I can come up with are "it's fun" and "lots of people do it"<div><br></div><div>So I'm asking these mailing lists: why do we base proof assistants on dependent type theory?  What are the trade-offs involved?</div><div>I'm interested both in explanations and arguments given on list, as well as in references to papers that discuss these sorts of choices.</div><div><br></div><div>Thanks,</div><div>Jason</div></div>
</blockquote></div></div>
</blockquote></div></div>