<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>∃xistential Type &#187; partial order</title>
	<atom:link href="http://existentialtype.net/tag/partial-order/feed/" rel="self" type="application/rss+xml" />
	<link>http://existentialtype.net</link>
	<description>For People Who Like Type and Types</description>
	<lastBuildDate>Fri, 29 Oct 2010 15:00:12 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3</generator>
		<item>
		<title>An unusual definition of total ordering</title>
		<link>http://existentialtype.net/2008/04/09/an-unusual-definition-of-total-ordering/</link>
		<comments>http://existentialtype.net/2008/04/09/an-unusual-definition-of-total-ordering/#comments</comments>
		<pubDate>Wed, 09 Apr 2008 15:16:03 +0000</pubDate>
		<dc:creator>washburn</dc:creator>
				<category><![CDATA[hacking]]></category>
		<category><![CDATA[software]]></category>
		<category><![CDATA[theory]]></category>
		<category><![CDATA[equivalence]]></category>
		<category><![CDATA[partial order]]></category>
		<category><![CDATA[properties]]></category>
		<category><![CDATA[relations]]></category>
		<category><![CDATA[scala]]></category>
		<category><![CDATA[total order]]></category>

		<guid isPermaLink="false">http://existentialtype.net/?p=237</guid>
		<description><![CDATA[One of the things that will show up in the imminently forthcoming Scala 2.7.1 release candidate, is the addition of traits for representing equivalence relations, partial orderings, and total orderings. Previously, the trait Ordered was used for representing totally ordered things: trait Ordered&#91;A&#93; &#123; def compare&#40;that: A&#41;: Int def &#60; &#40;that: A&#41;: Boolean = &#40;this [...]]]></description>
			<content:encoded><![CDATA[<p>One of the things that will show up in the imminently forthcoming Scala 2.7.1 release candidate, is the addition of traits for representing equivalence relations, partial orderings, and total orderings.  Previously,  the trait <code lang="scala">Ordered</code> was used for representing totally ordered things:</p>
<blockquote>
<pre class="scala"><a href="http://www.scala-lang.org/docu/files/ScalaReference.pdf"><span style="color: #009900;">trait</span></a> Ordered<span style="color: #e77801;">&#91;</span>A<span style="color: #e77801;">&#93;</span> <span style="color: #e77801;">&#123;</span>
<a href="http://www.scala-lang.org/docu/files/ScalaReference.pdf"><span style="color: #009900;">def</span></a> compare<span style="color: #e77801;">&#40;</span>that<span style="color: #a00000;">:</span> A<span style="color: #e77801;">&#41;</span><span style="color: #a00000;">:</span> <a href="http://www.scala-lang.org/docu/files/api/index.html"><span style="color: #5555cc;">Int</span></a>
<a href="http://www.scala-lang.org/docu/files/ScalaReference.pdf"><span style="color: #009900;">def</span></a> <span style="color: #a00000;">&lt;</span>  <span style="color: #e77801;">&#40;</span>that<span style="color: #a00000;">:</span> A<span style="color: #e77801;">&#41;</span><span style="color: #a00000;">:</span> <a href="http://www.scala-lang.org/docu/files/api/index.html"><span style="color: #5555cc;">Boolean</span></a> <span style="color: #a00000;">=</span> <span style="color: #e77801;">&#40;</span><a href="http://www.scala-lang.org/docu/files/ScalaReference.pdf"><span style="color: #009900;">this</span></a> compare that<span style="color: #e77801;">&#41;</span> <span style="color: #a00000;">&lt;</span>  <span style="color: #f78811;">0</span>
<a href="http://www.scala-lang.org/docu/files/ScalaReference.pdf"><span style="color: #009900;">def</span></a> <span style="color: #a00000;">&gt;</span>  <span style="color: #e77801;">&#40;</span>that<span style="color: #a00000;">:</span> A<span style="color: #e77801;">&#41;</span><span style="color: #a00000;">:</span> <a href="http://www.scala-lang.org/docu/files/api/index.html"><span style="color: #5555cc;">Boolean</span></a> <span style="color: #a00000;">=</span> <span style="color: #e77801;">&#40;</span><a href="http://www.scala-lang.org/docu/files/ScalaReference.pdf"><span style="color: #009900;">this</span></a> compare that<span style="color: #e77801;">&#41;</span> <span style="color: #a00000;">&gt;</span>  <span style="color: #f78811;">0</span>
<a href="http://www.scala-lang.org/docu/files/ScalaReference.pdf"><span style="color: #009900;">def</span></a> <span style="color: #a00000;">&lt;=</span> <span style="color: #e77801;">&#40;</span>that<span style="color: #a00000;">:</span> A<span style="color: #e77801;">&#41;</span><span style="color: #a00000;">:</span> <a href="http://www.scala-lang.org/docu/files/api/index.html"><span style="color: #5555cc;">Boolean</span></a> <span style="color: #a00000;">=</span> <span style="color: #e77801;">&#40;</span><a href="http://www.scala-lang.org/docu/files/ScalaReference.pdf"><span style="color: #009900;">this</span></a> compare that<span style="color: #e77801;">&#41;</span> <span style="color: #a00000;">&lt;=</span> <span style="color: #f78811;">0</span>
<a href="http://www.scala-lang.org/docu/files/ScalaReference.pdf"><span style="color: #009900;">def</span></a> <span style="color: #a00000;">&gt;=</span> <span style="color: #e77801;">&#40;</span>that<span style="color: #a00000;">:</span> A<span style="color: #e77801;">&#41;</span><span style="color: #a00000;">:</span> <a href="http://www.scala-lang.org/docu/files/api/index.html"><span style="color: #5555cc;">Boolean</span></a> <span style="color: #a00000;">=</span> <span style="color: #e77801;">&#40;</span><a href="http://www.scala-lang.org/docu/files/ScalaReference.pdf"><span style="color: #009900;">this</span></a> compare that<span style="color: #e77801;">&#41;</span> <span style="color: #a00000;">&gt;=</span> <span style="color: #f78811;">0</span>
<a href="http://www.scala-lang.org/docu/files/ScalaReference.pdf"><span style="color: #009900;">def</span></a> compareTo<span style="color: #e77801;">&#40;</span>that<span style="color: #a00000;">:</span> A<span style="color: #e77801;">&#41;</span><span style="color: #a00000;">:</span> <a href="http://www.scala-lang.org/docu/files/api/index.html"><span style="color: #5555cc;">Int</span></a> <span style="color: #a00000;">=</span> compare<span style="color: #e77801;">&#40;</span>that<span style="color: #e77801;">&#41;</span>
<span style="color: #e77801;">&#125;</span></pre>
</blockquote>
<p>However, the <code lang="scala">Ordered</code> trait does not provide a representation of a total ordering.  Therefore, the new trait <code>Ordering</code>:</p>
<blockquote>
<pre class="scala">&nbsp;
<a href="http://www.scala-lang.org/docu/files/ScalaReference.pdf"><span style="color: #009900;">trait</span></a> Ordering<span style="color: #e77801;">&#91;</span>T<span style="color: #e77801;">&#93;</span> <a href="http://www.scala-lang.org/docu/files/ScalaReference.pdf"><span style="color: #009900;">extends</span></a> PartialOrdering<span style="color: #e77801;">&#91;</span>T<span style="color: #e77801;">&#93;</span> <span style="color: #e77801;">&#123;</span>
  <a href="http://www.scala-lang.org/docu/files/ScalaReference.pdf"><span style="color: #009900;">def</span></a> compare<span style="color: #e77801;">&#40;</span>x<span style="color: #a00000;">:</span> T<span style="color: #a00000;">,</span> y<span style="color: #a00000;">:</span> T<span style="color: #e77801;">&#41;</span><span style="color: #a00000;">:</span> <a href="http://www.scala-lang.org/docu/files/api/index.html"><span style="color: #5555cc;">Int</span></a>
  <a href="http://www.scala-lang.org/docu/files/ScalaReference.pdf"><span style="color: #009900;">override</span></a> <a href="http://www.scala-lang.org/docu/files/ScalaReference.pdf"><span style="color: #009900;">def</span></a> lteq<span style="color: #e77801;">&#40;</span>x<span style="color: #a00000;">:</span> T<span style="color: #a00000;">,</span> y<span style="color: #a00000;">:</span> T<span style="color: #e77801;">&#41;</span><span style="color: #a00000;">:</span> <a href="http://www.scala-lang.org/docu/files/api/index.html"><span style="color: #5555cc;">Boolean</span></a> <span style="color: #a00000;">=</span> compare<span style="color: #e77801;">&#40;</span>x<span style="color: #a00000;">,</span> y<span style="color: #e77801;">&#41;</span> <span style="color: #a00000;">&lt;=</span> <span style="color: #f78811;">0</span>
  <a href="http://www.scala-lang.org/docu/files/ScalaReference.pdf"><span style="color: #009900;">override</span></a> <a href="http://www.scala-lang.org/docu/files/ScalaReference.pdf"><span style="color: #009900;">def</span></a> gteq<span style="color: #e77801;">&#40;</span>x<span style="color: #a00000;">:</span> T<span style="color: #a00000;">,</span> y<span style="color: #a00000;">:</span> T<span style="color: #e77801;">&#41;</span><span style="color: #a00000;">:</span> <a href="http://www.scala-lang.org/docu/files/api/index.html"><span style="color: #5555cc;">Boolean</span></a> <span style="color: #a00000;">=</span> compare<span style="color: #e77801;">&#40;</span>x<span style="color: #a00000;">,</span> y<span style="color: #e77801;">&#41;</span> <span style="color: #a00000;">&gt;=</span> <span style="color: #f78811;">0</span>
  <a href="http://www.scala-lang.org/docu/files/ScalaReference.pdf"><span style="color: #009900;">override</span></a> <a href="http://www.scala-lang.org/docu/files/ScalaReference.pdf"><span style="color: #009900;">def</span></a> lt<span style="color: #e77801;">&#40;</span>x<span style="color: #a00000;">:</span> T<span style="color: #a00000;">,</span> y<span style="color: #a00000;">:</span> T<span style="color: #e77801;">&#41;</span><span style="color: #a00000;">:</span> <a href="http://www.scala-lang.org/docu/files/api/index.html"><span style="color: #5555cc;">Boolean</span></a> <span style="color: #a00000;">=</span> compare<span style="color: #e77801;">&#40;</span>x<span style="color: #a00000;">,</span> y<span style="color: #e77801;">&#41;</span> <span style="color: #a00000;">&lt;</span> <span style="color: #f78811;">0</span>
  <a href="http://www.scala-lang.org/docu/files/ScalaReference.pdf"><span style="color: #009900;">override</span></a> <a href="http://www.scala-lang.org/docu/files/ScalaReference.pdf"><span style="color: #009900;">def</span></a> gt<span style="color: #e77801;">&#40;</span>x<span style="color: #a00000;">:</span> T<span style="color: #a00000;">,</span> y<span style="color: #a00000;">:</span> T<span style="color: #e77801;">&#41;</span><span style="color: #a00000;">:</span> <a href="http://www.scala-lang.org/docu/files/api/index.html"><span style="color: #5555cc;">Boolean</span></a> <span style="color: #a00000;">=</span> compare<span style="color: #e77801;">&#40;</span>x<span style="color: #a00000;">,</span> y<span style="color: #e77801;">&#41;</span> <span style="color: #a00000;">&gt;</span> <span style="color: #f78811;">0</span>
  <a href="http://www.scala-lang.org/docu/files/ScalaReference.pdf"><span style="color: #009900;">override</span></a> <a href="http://www.scala-lang.org/docu/files/ScalaReference.pdf"><span style="color: #009900;">def</span></a> equiv<span style="color: #e77801;">&#40;</span>x<span style="color: #a00000;">:</span> T<span style="color: #a00000;">,</span> y<span style="color: #a00000;">:</span> T<span style="color: #e77801;">&#41;</span><span style="color: #a00000;">:</span> <a href="http://www.scala-lang.org/docu/files/api/index.html"><span style="color: #5555cc;">Boolean</span></a> <span style="color: #a00000;">=</span> compare<span style="color: #e77801;">&#40;</span>x<span style="color: #a00000;">,</span> y<span style="color: #e77801;">&#41;</span> <span style="color: #a00000;">==</span> <span style="color: #f78811;">0</span>
<span style="color: #e77801;">&#125;</span>
&nbsp;</pre>
</blockquote>
<p>The tricky part however, was writing description of the properties required of something that implements the <code lang="scala">Ordering</code> trait.  When one normally thinks of a <a href="http://en.wikipedia.org/wiki/Total_order">total ordering</a> one thinks of a relation that is</p>
<ul>
<li>anti-symmetric,</li>
<li>transitive,</li>
<li>and total.</li>
</ul>
<p>The problem is that <code lang="scala">Ordering</code> is not defined in terms of a binary relation, but a binary function producing integers (<code lang="scala">compare</code>).  If the first argument is less than the second the function returns a negative integer, if they are equal in the ordering the function returns zero, and if the second argument is less than the first the function returns a positive integer.  Therefore, it is not straightforward to express these same properties.  The best I could come up with was</p>
<ul>
<li><code lang="scala">compare(x, x) == 0</code>, for any <code lang="scala">x</code> of type <code lang="scala">T</code>.</li>
<li><code lang="scala">compare(x, y) == z</code> and <code lang="scala">compare(y, x) == w</code> then <code lang="scala">Math.signum(z) == -Math.signum(w)</code>, for any <code lang="scala">x</code> and <code lang="scala">y</code> of type <code lang="scala">T</code> and <code lang="scala">z</code> and <code lang="scala">w</code> of type <code lang="scala">Int</code>.</li>
<li>if <code lang="scala">compare(x, y) == z</code> and <code lang="scala">lteq(y, w) == v</code> and <code lang="scala">Math.signum(z) &gt;= 0</code> and <code lang="scala">Math.signum(v) &gt;= 0</code> then<br />
 <code lang="scala">compare(x, w) == u</code> and <code lang="scala">Math.signum(z + v) == Math.signum(u)</code>,<br />
 for any <code lang="scala">x</code>, <code lang="scala">y</code>, and <code lang="scala">w</code> of type <code lang="scala">T</code> and <code lang="scala">z</code>, <code lang="scala">v</code>, and <code lang="scala">u</code> of type <code lang="scalal">Int</code>.</li>
</ul>
<p>Where <code lang="scala">Math.signum</code> returns <code lang="scala">-1</code> if its input is negative, <code lang="scala">0</code> if its input is <code lang="scala">0</code>, and <code lang="scala">1</code> if its input is positive.</p>
<p>The first property is clearly reflexivity.  I call the third property transitivity.  I am not sure what to call the second property. I do not think a notion of totality is required because it is assumed you will always get an integer back from <code lang="scala">compare</code> rather than it throwing an exception or going into an infinite loop.  </p>
<p>It would probably be a good exercise to prove that given these properties on <code lang="scala">compare</code> hold if and only if <code lang="scala">lteq</code> (defined above in terms of <code lang="scala">compare</code>) has all the normal properties of a total ordering.</p>
]]></content:encoded>
			<wfw:commentRss>http://existentialtype.net/2008/04/09/an-unusual-definition-of-total-ordering/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

