Received: by 10.204.151.213 with SMTP id d21mr1368071bkw.0.1342378929518; Sun, 15 Jul 2012 12:02:09 -0700 (PDT) X-BeenThere: pure-lang@googlegroups.com Received: by 10.205.119.129 with SMTP id fu1ls4134524bkc.4.gmail; Sun, 15 Jul 2012 12:02:07 -0700 (PDT) Received: by 10.204.151.213 with SMTP id d21mr1368061bkw.0.1342378927779; Sun, 15 Jul 2012 12:02:07 -0700 (PDT) Received: by 10.204.151.213 with SMTP id d21mr1368060bkw.0.1342378927758; Sun, 15 Jul 2012 12:02:07 -0700 (PDT) Return-Path: Received: from mailout01.t-online.de (mailout01.t-online.de. [194.25.134.80]) by gmr-mx.google.com with ESMTP id j4si3653270bkj.3.2012.07.15.12.02.07; Sun, 15 Jul 2012 12:02:07 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of Dr.Gr...@t-online.de designates 194.25.134.80 as permitted sender) client-ip=194.25.134.80; Authentication-Results: gmr-mx.google.com; spf=pass (google.com: best guess record for domain of Dr.Gr...@t-online.de designates 194.25.134.80 as permitted sender) smtp.mail=Dr.Gr...@t-online.de Received: from fwd55.aul.t-online.de (fwd55.aul.t-online.de ) by mailout01.t-online.de with smtp id 1SqU50-0005iS-NW; Sun, 15 Jul 2012 21:02:06 +0200 Received: from [192.168.1.2] (JO9P3OZHrhErN-ySXta1DK0-qNk9+ncpttfFIwvdzmPf7Kkrg0fpH2Foksckkm-ZxM@[79.211.77.20]) by fwd55.t-online.de with esmtp id 1SqU4p-1yiDAW0; Sun, 15 Jul 2012 21:01:55 +0200 Message-ID: <500313AB.80506@t-online.de> Date: Sun, 15 Jul 2012 21:02:03 +0200 From: Albert Graef User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:13.0) Gecko/20120615 Thunderbird/13.0.1 MIME-Version: 1.0 To: pure-lang@googlegroups.com Subject: Re: [pure-lang] pure and units of measure References: <5000093A.4070606@gmail.com> <500173B5.3080805@t-online.de> In-Reply-To: <500173B5.3080805@t-online.de> Content-Type: multipart/mixed; boundary="------------070400060407040008040007" X-ID: JO9P3OZHrhErN-ySXta1DK0-qNk9+ncpttfFIwvdzmPf7Kkrg0fpH2Foksckkm-ZxM X-TOI-MSGID: 8fef7dca-07b2-4465-ba84-e7f9326230ed This is a multi-part message in MIME format. --------------070400060407040008040007 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit On 07/14/2012 03:27 PM, Albert Graef wrote: > This is an interesting problem. :) As an alternative to Jim's approach, > it can be viewed as a kind of algebraic simplication system and thus > solved with symbolic rules. I've cobbled together a quick and dirty > solution along these lines, which converts arbitrary units to the > standard (SI) ones. Here's an updated version of the script, which confines the normalization to local rule sets (http://docs.pure-lang.googlecode.com/hg/purelib.html#reduce). I think that this design is preferable because it doesn't interfere with the global arithmetics, and it also allows to give a better definition of the 'as' conversion operator. The downside is that you'll have to explicitly call a function 'si' to do the normalization now. For instance: > si (1*feet^3/minutes+1*gallons/seconds); 0.0042573592272*meters^3*seconds^(-1) > ans as liters/minutes; 255.441000762531*liters*minutes^(-1) > si ans; 0.00425735001270885*meters^3*seconds^(-1) > ans as inches^3/hours; 935277.192856837*inches^3*hours^(-1) I also added a few more units, e.g.: > si (1*yards^2); 0.83612736*meters^2 > ans as inches^2; 1295.99999999099*inches^2 > 30*celsius as fahrenheit; 86.0000000030605*fahrenheit Well, obviously the numeric solver used by 'as' still needs to be improved, I'm leaving that as an exercise. ;-) But other than that it seems to work pretty well, and adding more units should be a piece of cake now. Albert -- Dr. Albert Gr"af Dept. of Music-Informatics, University of Mainz, Germany Email: Dr.Gr...@t-online.de, a...@muwiinfa.geschichte.uni-mainz.de WWW: http://www.musikinformatik.uni-mainz.de/ag --------------070400060407040008040007 Content-Type: text/plain; charset=UTF-8; name="units.pure" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="units.pure" Ci8vIHNhbXBsZSB1bml0cwpub25maXgKICBtaWxlcyB5YXJkcyBmZWV0IGluY2hlcyBraWxv bWV0ZXJzIG1ldGVycyBjZW50aW1ldGVycyBtaWxsaW1ldGVycyAvLyBsZW5ndGgKICBhY3Jl cyAvLyBhcmVhCiAgZ2FsbG9ucyBsaXRlcnMgLy8gdm9sdW1lCiAga2lsb2dyYW1zIGdyYW1z IHBvdW5kcyBvdW5jZXMgLy8gbWFzcwogIHNlY29uZHMgbWludXRlcyBob3VycyAvLyB0aW1l CiAgZmFocmVuaGVpdCBjZWxzaXVzIGtlbHZpbjsgLy8gdGVtcGVyYXR1cmUKCi8vIGJhc2Ug dW5pdHMKdHlwZSB1bml0IG1pbGVzIHwgdW5pdCB5YXJkcyB8IHVuaXQgZmVldCB8IHVuaXQg aW5jaGVzIHwKICB1bml0IGtpbG9tZXRlcnMgfCB1bml0IG1ldGVycyB8IHVuaXQgY2VudGlt ZXRlcnMgfCB1bml0IG1pbGxpbWV0ZXJzIHwKICB1bml0IGFjcmVzIHwgdW5pdCBnYWxsb25z IHwgdW5pdCBsaXRlcnMgfAogIHVuaXQga2lsb2dyYW1zIHwgdW5pdCBncmFtcyB8IHVuaXQg cG91bmRzIHwgdW5pdCBvdW5jZXMgfAogIHVuaXQgc2Vjb25kcyB8IHVuaXQgbWludXRlcyB8 IHVuaXQgaG91cnMgfAogIHVuaXQgZmFocmVuaGVpdCB8IHVuaXQgY2Vsc2l1cyB8IHVuaXQg a2VsdmluOwovLyBwb3dlcnMgb2YgYmFzZSB1bml0cwp0eXBlIHVuaXQgKHU6OnVuaXRebjo6 aW50KTsKLy8gY29tcGxlbWVudCB0eXBlCnR5cGUgbm9udW5pdCB4ID0gfnR5cGVwIHVuaXQg eDsKCi8vIFNvbWUgaGVscGVyIGZ1bmN0aW9ucyB0byBkZWFsIHdpdGggdW5pdHMgYW5kIGRp bWVuc2lvbmVkIHZhbHVlcy4KCi8vIGRldGVybWluZSB0aGUgYmFzZSBhbmQgcG93ZXIgb2Yg YSB1bml0CmJhc2Vfb2YgdTo6dW5pdCA9IGNhc2UgdSBvZiB1Xm4gPSBiYXNlX29mIHU7IF8g PSB1IGVuZDsKcG93ZXJfb2YgdTo6dW5pdCA9IGNhc2UgdSBvZiB1Xm4gPSBuKnBvd2VyX29m IHU7IF8gPSAxIGVuZDsKCi8vIHNwbGl0IGEgZGltZW5zaW9uZWQgdmFsdWUgaW4gdGhlIG5v cm1hbCBmb3JtIHgqdTEqLi4uKnVuIChzZWUgYmVsb3cpIGludG8KLy8gaXRzIHZhbHVlICh4 KSBhbmQgdW5pdCAodTEqLi4uKnVuKSBwYXJ0cwp2YWx1ZV9vZiB4ID0gY2FzZSB4IG9mIHgq dTo6dW5pdCA9IHZhbHVlX29mIHg7IF8gPSB4IGVuZDsKdW5pdF9vZiB4ID0gY2FzZSB4IG9m CiAgeCp1Ojp1bml0ID0gY2FzZSB1bml0X29mIHggb2YgMSA9IHU7IHYgPSB2KnUgZW5kOwog IF8gPSAxOwplbmQ7CgovLyBDb252ZXJzaW9ucyB0byBzdGFuZGFyZCAoU0kpIHVuaXRzLgoK c3RhbmRhcmRfdW5pdHMgPSByZWR1Y2Ugd2l0aAogIG1pbGVzID0gMTc2MCp5YXJkczsKICB5 YXJkcyA9IDMqZmVldDsKICBmZWV0ID0gMTIqaW5jaGVzOwogIGluY2hlcyA9IDIuNTQqY2Vu dGltZXRlcnM7CiAga2lsb21ldGVycyA9IDEwMDAqbWV0ZXJzOwogIGNlbnRpbWV0ZXJzID0g MC4wMSptZXRlcnM7CiAgbWlsbGltZXRlcnMgPSAwLjAwMSptZXRlcnM7CgogIGFjcmVzID0g NDM1NjAqZmVldF4yOwoKICBnYWxsb25zID0gMjMxKmluY2hlc14zOwogIGxpdGVycyA9IDEw MDAqY2VudGltZXRlcnNeMzsKCiAgZ3JhbXMgPSAwLjAwMSpraWxvZ3JhbXM7CiAgcG91bmRz ID0gNDUzLjU5MjM3KmdyYW1zOwogIG91bmNlcyA9IHBvdW5kcy8xNjsKCiAgbWludXRlcyA9 IDYwKnNlY29uZHM7CiAgaG91cnMgPSA2MCptaW51dGVzOwoKICB4KmNlbHNpdXMgPSAoeCsy NzMuMTUpKmtlbHZpbjsKICB4KmZhaHJlbmhlaXQgPSAoNSooeC0zMikvOSkqY2Vsc2l1czsK ZW5kOwoKLyogVGhlIGZvbGxvd2luZyBydWxlcyBzaHVmZmxlIGFyb3VuZCB1bml0cyB1bnRp bCBhIGRpbWVuc2lvbmVkIHZhbHVlIHgqdSBlbmRzCiAgIHVwIGluIHRoZSBub3JtYWwgZm9y bSB4KnUxKi4uLip1bi4gSXQgYWxzbyBzb3J0cyB0aGUgdW5pdHMgYWNjb3JkaW5nIHRvCiAg IHRoZWlyIG5hbWVzIGFuZCByZWR1Y2VzIHRvIHBvd2VycyBvZiB1bml0cyB3aGVyZSBwb3Nz aWJsZS4gVW5pdHMgaW4gdGhlCiAgIGRlbm9taW5hdG9yIGFyZSBleHByZXNzZWQgYXMgbmVn YXRpdmUgcG93ZXJzOyB0aGVzZSBhbHdheXMgY29tZSBsYXN0LiAqLwoKcmVkdWNlX3VuaXRz ID0gcmVkdWNlIHdpdGgKICB4L3U6OnVuaXQgPSB4KnVeKC0xKTsKCiAgdTo6dW5pdF4wID0g MTsKICB1Ojp1bml0XjEgPSB1OwogICh1Ojp1bml0Xm46OmludClebTo6aW50ID0gdV4obipt KTsKCiAgeCp1Ojp1bml0KnY6OnVuaXQgPSB4KnVeKHBvd2VyX29mIHUrcG93ZXJfb2Ygdikg aWYgYmFzZV9vZiB1ID09PSBiYXNlX29mIHY7CgogIHgqKHkqdTo6dW5pdCkgPSB4KnkqdTsK ICB4Kih5L3U6OnVuaXQpID0geCp5L3U7CiAgeC8oeSp1Ojp1bml0KSA9IHgveS91OwogIHgv KHkvdTo6dW5pdCkgPSB4L3kqdTsKCiAgdTo6dW5pdCp5Ojpub251bml0ID0geSp1OwogIHU6 OnVuaXQveTo6bm9udW5pdCA9IDEveSp1OwogIHgqdTo6dW5pdCp5Ojpub251bml0ID0geCp5 KnU7CiAgeCp1Ojp1bml0L3k6Om5vbnVuaXQgPSB4L3kqdTsKICB4L3U6OnVuaXQqeTo6bm9u dW5pdCA9IHgqeS91OwogIHgvdTo6dW5pdC95Ojpub251bml0ID0geC95L3U7CgogIHgqdTo6 dW5pdCp2Ojp1bml0ID0geCp2KnUKICAgIGlmIHNnbiAocG93ZXJfb2YgdSkgPCBzZ24gKHBv d2VyX29mIHYpIHx8CiAgICAgIHNnbiAocG93ZXJfb2YgdSkgPT0gc2duIChwb3dlcl9vZiB2 KSAmJiBzdHIgKGJhc2Vfb2YgdSkgPiBzdHIgKGJhc2Vfb2Ygdik7CgogICh4KnU6OnVuaXQp Xm46OmludCA9IHhebip1Xm47CgogIHgqdTo6dW5pdCt5KnUgPSAoeCt5KSp1OwogIHgqdTo6 dW5pdC15KnUgPSAoeC15KSp1OwogIC14KnU6OnVuaXQgPSAoLXgpKnU7CmVuZDsKCi8vIE5v cm1hbGl6ZSBhIGRpbWVuc2lvbmVkIHZhbHVlLCBjb252ZXJ0aW5nIGl0IHRvIHN0YW5kYXJk IHVuaXRzLiBOb3RlIHRoYXQKLy8geW91IGNhbiBqdXN0IHVzZSByZWR1Y2VfdW5pdHMgaW5z dGVhZCBpZiB5b3Ugd2FudCB0byBub3JtYWxpemUgdGhlIHZhbHVlCi8vIHdpdGhvdXQgY29u dmVydGluZyBpdC4KCnNpIHggPSByZWR1Y2VfdW5pdHMgKHN0YW5kYXJkX3VuaXRzIHgpOwoK Ly8gQ29udmVydCBhIGRpbWVuc2lvbmVkIHZhbHVlIHRvIGFueSAocG9zc2libHkgbm9uLXN0 YW5kYXJkKSB1bml0cywgcmVkdWNlZAovLyB0byBub3JtYWwgZm9ybS4gU291cmNlIGFuZCB0 YXJnZXQgdW5pdHMgbXVzdCBiZSBjb21wYXRpYmxlLgoKaW5maXggMTQ1MCBhczsKCnggYXMg dSA9IHJlZHVjZV91bml0cyAoeSp1KSB3aGVuCiAgLy8gTm90ZSB0aGF0IHdlIGludm9rZSB0 aGUgc29sdmVyIHdpdGggdGhlIHByZWNvbXB1dGVkIG5vcm1hbCBmb3JtIHYgb2YgdGhlCiAg Ly8gdGFyZ2V0IHVuaXQgaW5zdGVhZCBvZiB1IGl0c2VsZi4gVGhlIHJlc3VsdHMgc2hvdWxk bid0IGRpZmZlciBidXQgdGhpcwogIC8vIHdpbGwgcHJlc3VtYWJseSBzcGVlZCB1cCB0aGUg Y29tcHV0YXRpb24uCiAgdiA9IHVuaXRfb2YgKHJlZHVjZV91bml0cyAoMSp1KSk7CiAgeSA9 IHNvbHZlIHYgKHZhbHVlX29mIHgpOwplbmQgaWYgdW5pdF9vZiB5ID09PSB1bml0X29mIHgg d2hlbgogIC8vIE5vcm1hbGl6ZSB4IHNvIHRoYXQgaXQgdXNlcyBzdGFuZGFyZCB1bml0cy4K ICB4ID0gcmVkdWNlX3VuaXRzIChzdGFuZGFyZF91bml0cyB4KTsKICAvLyBBbHNvIG5vcm1h bGl6ZSB0aGUgdGFyZ2V0IHVuaXQgc28gdGhhdCB3ZSBjYW4gY2hlY2sgdGhhdCBzb3VyY2Ug YW5kCiAgLy8gdGFyZ2V0IGFyZSBjb21wYXRpYmxlLgogIHkgPSByZWR1Y2VfdW5pdHMgKHN0 YW5kYXJkX3VuaXRzICgxKnUpKTsKZW5kIHdpdGgKICAvLyBRdWljay1hbmQgZGlydHkgaW1w bGVtZW50YXRpb24gb2YgTmV3dG9uJ3Mgcm9vdCBmaW5kZXIgdG8gc29sdmUgZm9yIGEKICAv LyBnaXZlbiB1bml0LiBGSVhNRTogVGhpcyBpc24ndCBhY2N1cmF0ZSBlbm91Z2guCiAgZXBz ID0gMWUtODsKICBzb2x2ZSB1IHggPSBzb2x2ZSBlcHMgZXBzIChceS0+ZiB5LXgpIHggd2l0 aAogICAgZiB5ID0gdmFsdWVfb2YgKHNpICh5KnUpKTsKICAgIHNvbHZlIGR4IGR5IGYgPSB1 bnRpbCAoc2F0aXMgZHkgZikgKGltcHJvdmUgZHggZik7CiAgICB1bnRpbCBwIGYgeCA9IGlm IHAgeCB0aGVuIHggZWxzZSB1bnRpbCBwIGYgKGYgeCk7CiAgICBzYXRpcyBkeSBmIHggPSBh YnMgKGYgeCkgPCBkeTsKICAgIGltcHJvdmUgZHggZiB4ID0geCAtIGYgeCAvIGRlcml2ZSBk eCBmIHg7CiAgICBkZXJpdmUgZHggZiB4ID0gKGYgKHgrZHgpIC0gZiB4KSAvIGR4OwogIGVu ZDsKZW5kOwo= --------------070400060407040008040007--