<?xml version="1.0" encoding="iso-8859-1"?>
<feed version="0.3" xmlns="http://purl.org/atom/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xml:lang="en">

<title>hakank.blogg</title>
<link rel="alternate" type="text/html" href="http://www.hakank.org/webblogg/" />

<modified>2012-12-04T18:28:26Z</modified>
<tagline>Anteckningar från en PopSci-junkie. Av Håkan Kjellerstrand (hakank@gmail.com).</tagline>

<id>tag:www.hakank.org,2012:/webblogg/1</id>

<generator url="http://www.movabletype.org/" version="3.2">Movable Type</generator>
<copyright>Copyright (c) 2012, hakank</copyright>

<entry>
<title>Byte av epostadress, samt annat</title>
<link rel="alternate" type="text/html" href="http://www.hakank.org/webblogg/archives/001473.html" />

<modified>2012-12-04T18:28:26Z</modified>
<issued>2012-11-30T19:59:59Z</issued>

<id>tag:www.hakank.org,2012:/webblogg/1.1473</id>

<created>2012-11-30T19:59:59Z</created>
<summary type="text/plain">Äntligen - säger kanske någon - så kommer det något livstecken från Håkan. Den som säger så har i så fall missat följande livstecken: My Constraint Programming Blog (uppdateras typ någon/några gånger i månaden) Arrays in Flux (som i och...</summary>

<author>
<name>hakank</name>
<url>http://www.hakank.org/webblogg</url>

<email>hakank@bonetmail.com</email>
</author>
<dc:subject>Personligt</dc:subject>

<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://www.hakank.org/webblogg/">
<![CDATA[<p>Äntligen - säger kanske någon - så kommer det något livstecken från Håkan. Den som säger så har i så fall missat följande livstecken:  <ul><li> <a href="http://www.hakank.org/constraint_programming_blog/">My Constraint Programming Blog</a> (uppdateras typ någon/några gånger i månaden)<br />
    <li> <a href="http://www.hakank.org/arrays_in_flux/">Arrays in Flux</a> (som i och för sig mest innehåller gamla livstecken)<br />
   <li> <a href="http://www.hakank.org/">hakank.org</a> som innehåller - men odaterade - tecken om olika saker som gjorts (den senaste - i skrivande stund - tiden har det varit rätt mycket lekande med nya - för mig - programspråk och liknande).<br />
 </ul></p>

<p>Men - "tyvärr" kanske någon säger, eventuellt samma någon som ovan nämnda någon - så är denna blogpost endast (fast nästan) för att meddela den viktiga information att jag <b>numera helt gått över till en annan epostadress, nämligen <a href="mailto:hakank@gmail.com">hakank@gmail.com</a></b>. Detta eftersom Bredbandsbolaget helt och hållet stänger trotjänaren bonetmailen-adressen som varit med i nästan exakt 10 år (tack för denna tid, för övrigt).</p>

<p>Dock, för att ni inte ska gå helt tomhänta härifrån så kan meddelas följande - till viss del helt orelaterade - saker, fast ändå inte eftersom sak numro 2 är väldigt relaterad, på vissa sätt och vis i alla fall:</p>

<h3>Språkligheter</h3>
Följande ord innehåller vokalerna <code>a,e,i,o,u,y</code> i ordning:
<ul>
   <li> <code>accelerationsmunstycke</code>
   <li> <code>satellitkommunikationssystem</code>
</ul>

<p>Detta ord innehåller vokalerna <code>a,e,i,o,u,y,å,ä,ö</code> i ordning: <ul>   <li> <code>satellitkommunikationssystemåtgärdsförslag</code><br />
</ul></p>

<p>Och ordet <code>tryckutjämningsbehållare</code> är det ord (från den ordlista som be-sökts)<br />
som innehåller flest olika bokstäver (20 stycken). Här är deras fördelning: <ul><li> a: 1<br />
        <li> b: 1<br />
        <li> c: 1<br />
        <li> e: 2<br />
        <li> g: 1<br />
        <li> h: 1<br />
        <li> i: 1<br />
        <li> j: 1<br />
        <li> k: 1<br />
        <li> l: 2<br />
        <li> m: 1<br />
        <li> n: 2<br />
        <li> r: 2<br />
        <li> s: 1<br />
        <li> t: 2<br />
        <li> u: 1<br />
        <li> y: 1<br />
        <li> å: 1<br />
        <li> ö: 1<br />
</ul></p>

<p>Och följande ord är de som innehåller flest distinkta bokstäver, exakt en förekomst alltså (16 unika bokstäver) <br />
utifrån densamma ordlista: <ul>   <li> giftermålsanbud<br />
   <li> ishockeyförbund<br />
   <li> jämlikhetsfråga<br />
   <li> oförvansklighet<br />
</ul></p>

<p><font color="red">Se nedan under "Senare not" för en senare not om detta.</font></p>

<h3>Byte av mailadressen</h3>
Men - kanske någon kunde säga om just denne någon är bevandrad i data(sv)engelska -: <i>Men hördudu Håkan, <code>byte</code> har ju en engelsk betydelse också, har du tänkt på det?</i>. Varpå jag i så fall kunde svara: <i>Ah, kul du tänkte på det! Det tänker man ju inte på om man bara säger ordet högt.</i>, och skulle då därefter kunna beskriva en algoritm för just denna betydelse av "byte av mailadress", nämligen transformeringen av <code>hakank@gmail.com</code> till en byte: Byt (sic!) ut varje bokstav till dess ASCII-värde, summera dess värden tillsammans och på denna summa gör man sedan en fin modulo <s>255</s> 256. För min nya gmail-adress blir det 37. <s><b>43</b> (så nära!)</s>. 

<p>Varpå man skulle kunna implementera algoritmen i programspråket <a href="http://www.hakank.org/k/">K</a> (om man hade den inklinationen och det har man ju ibland, eller hur?): <s><pre>  (+/{_ic x}'"hakank@gmail.com")!255<br />
43<br />
</pre></s></p>

<p> <pre>  (+/{_ic x}'"hakank@gmail.com")!256<br />
37<br />
</pre></p>

<p>(<a href="http://www.hakank.org/k/">K</a> är - för övrigt och som eventuellt kan ses med ovanstående kodexempel - ett väldigt uttrycksfullt "array language" som gör att man mycket kärnfullt kan uttrycka sina innersta tankar kring vissa saker i tillvaron, t.ex. saker såsom saker av ovanstående problemstruktur. Språket  är en del i APL-familjen och typ en kusin till programspråket J. Hittills har K varit mer favoritspråk än J, men det är möjligt att detta ändras vad det lider.)</p>

<p><font color="red">Senare not:</font><br />
Samma person som påpekade (i ett mail som tyvärr - synnerligen felaktigt - ansetts av Google som spam) att det ska vara modulo 256 istället för 255, gav även förslaget "mödoutvecklingsbar" som ett längre ord med unika bokstäver än ovanstående. Även densamma person ansåg att det föreslagna ordet är  "lite krystad, kanske" och påpekade att ordet inte fanns i Googles sökmotor; och det måste vi ju ändra på.<br />
<font color="red">Slut senare not</font></p>]]>


</content>
</entry>
<entry>
<title>Ny engelskspråkig blogg: Arrays in Flux</title>
<link rel="alternate" type="text/html" href="http://www.hakank.org/webblogg/archives/001358.html" />

<modified>2010-02-21T17:44:27Z</modified>
<issued>2010-02-21T17:46:54Z</issued>

<id>tag:www.hakank.org,2010:/webblogg/1.1358</id>

<created>2010-02-21T17:46:54Z</created>
<summary type="text/plain">Häromdagen startade jag min andra engelskspråkiga blogg: Arrays in Flux (ungefär &quot;Vektorer i rörelse&quot;). Det första inlägget Arrays in Flux: My third blog, and second English beskriver inriktningen och förklarar namnet mer. Det andra inlägget, som precis publicerades, Symbolic regression...</summary>

<author>
<name>hakank</name>
<url>http://www.hakank.org/webblogg</url>

<email>hakank@bonetmail.com</email>
</author>
<dc:subject>Blogging</dc:subject>

<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://www.hakank.org/webblogg/">
<![CDATA[<p>Häromdagen startade jag min andra engelskspråkiga blogg: <a href="http://www.hakank.org/arrays_in_flux/">Arrays in Flux</a> (ungefär "Vektorer i rörelse").</p>

<p>Det första inlägget <a href="http://www.hakank.org/arrays_in_flux/2010/02/arrays_in_flux_my_third_blog_and_second_english.html">Arrays in Flux: My third blog, and second English</a> beskriver inriktningen och förklarar namnet mer.</p>

<p>Det andra inlägget, som precis publicerades, <a href="http://www.hakank.org/arrays_in_flux/2010/02/symbolic_regression_using_genetic_programming_with_jgap_1.html">Symbolic regression (using genetic programming) with JGAP</a> beskriver det jag hållt på med de senaste veckorna. Det är en utveckling av det som skrevs om i <a href="http://www.hakank.org/webblogg/archives/001354.html">Eureqa: equ.ation discovery med genetisk programmering</a>.<br />
</p>]]>


</content>
</entry>
<entry>
<title>Eureqa: equation discovery med genetisk programmering</title>
<link rel="alternate" type="text/html" href="http://www.hakank.org/webblogg/archives/001354.html" />

<modified>2010-01-28T07:54:14Z</modified>
<issued>2010-01-24T08:16:07Z</issued>

<id>tag:www.hakank.org,2010:/webblogg/1.1354</id>

<created>2010-01-24T08:16:07Z</created>
<summary type="text/plain">(For English readers: This blog post is available as a Google Translation from this Swedish text: Eureqa: equations discovery with genetic programming.) För mer än 6 år sedan bloggade jag om equation discovery (att hitta ekvationer/samband givet en datamängd) och...</summary>

<author>
<name>hakank</name>
<url>http://www.hakank.org/webblogg</url>

<email>hakank@bonetmail.com</email>
</author>
<dc:subject>Machine learning/data mining</dc:subject>

<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://www.hakank.org/webblogg/">
<![CDATA[<p>(For English readers: This blog post is available as a Google Translation from this Swedish text: <a href="http://translate.google.se/translate?u=http%3A%2F%2Fwww.hakank.org%2Fwebblogg%2Farchives%2F001354.html&sl=sv&tl=en&hl=&ie=UTF-8">Eureqa: equations discovery with genetic programming</a>.)</p>

<p>För mer än 6 år sedan bloggade jag om <a href="http://www.hakank.org/webblogg/archives/000003.html">equation discovery</a> (att hitta ekvationer/samband givet en datamängd) och hittade några roliga system som jag då kollade in rätt mycket. </p>

<p>Nu är det dags igen: <a href="http://ccsl.mae.cornell.edu/eureqa">Eureqa</a> är ett modernt equations discovery-system baserat på genetisk programming (närmare bestämt <a href="http://en.wikipedia.org/wiki/Symbolic_Regression">symbolisk regression</a>) och det har ett fint GUI etc.</p>

<p>Eureqa blev världskänt i början av december förra året genom att Wired skrev en artikel om systemet och forskningen/forskarna bakom: <a href="http://www.wired.com/wiredscience/2009/12/download-robot-scientist/">Download Your Own Robot Scientist</a>. Faktum är att jag laddade ner systemet och testade det lite men jag höll på på med <a href="http://www.hakank.org/constraint_programming_blog/2009/12/sicstus_prolog_41_released_and_1.html">andra saker</a>.</p>

<p>De senaste dagarna har jag suttit med några enkla problem (dvs datafiler) för att lära känna Eureqa mer. Mer avancerade saker såsom dynamiska modeller (differentialekvationer) och komplexa ekonomiska system (såsom börskurser) tar jag tag i senare.</p>

<p>Jag tänker inte gå in på vad genetisk programmering är mer än att säga att det använder inspiration från biologin för att leta rätt på en lösning. Se vidare <a href="http://en.wikipedia.org/wiki/Genetic_programming">genetic programming</a> (Wikipedia) för mer info och länkar. </p>

<p>Huvudprincipen för den variant av genetisk programmering som Eureqa använder är att man har <br />
 - en datamängd <br />
 - ett visst antal matematiska funktioner ("byggklossar") <br />
 - en relation mellan variabler som man vill studera</p>

<p>Eureqa hittar då givet variablerna och funktioner ett antal samband (lösningar, modeller). Med en "felfunktion" (error function) kommer diskrepansen mellan data och den skapade modellen att minska till ett så litet värde som möjligt, förhoppningsvis 0.</p>

<p>Här följer några kommentarer och ett och annat tips. Först beskrivs Eureqa, sedan lite mer om modelleringen med några exempel. Efter det länkar till några av de datafiler som används, och sist mer länkar om Eureqa.</p>

<p>Mycket kortfattat: Jag tycker Eureqa är ett riktigt trevlig och skoj system, tyvärr rätt mycket CPU-slukande för att min dator ska må riktigt bra. Men skoj.</p>

<p>Min vana trogen skapades även en <a href="http://www.hakank.org/eureqa/">My Eureqa page</a> för länkar, filer och annat etc.</p>

<h3>Installation</h3>
Programmet finns att ladda ner <a href="http://ccsl.mae.cornell.edu/eureqa_download">här</a>.

<p>Tyvärr finns endast en Windows-version men det ska komma klienter för åtminstone Linux. Jag har inga större svårigheter att köra Eureqa under Wine förutom att det alltså tar väldigt mycket kräm när det bearbetar data.</p>

<p>Det installerades på min burk med följande kommando:<br />
<pre>wine msiexec /i eureqa_full_0.7.7.msi</pre></p>

<p>och kör det sedan med<br />
<pre>wine "&lt;installation path in Wine&gt;/Eureqa.exe"</pre></p>

<h3>Mer om systemet</h3>
Eureqa har ett mycket trevligt GUI med olika tabbar för data, plottning/smoothing av data, modellering, start/stop och lösning.  Dessa tabbar presenteras här kortfattat.

<p>* "Enter Data"<br />
Man kan skriva in data som i ett enkelt spreadsheet ā la Open Office Calc eller Excel (vad jag vet stöds inte formler etc). Det sätt jag använder är dock att skapa en text fil (ASCII) som består av följande:<br />
  - header med information om fälten. T.ex. <br />
     % | x y z |<br />
    där "%" är kommentar och de två "|" är avgränsare för variabelnamnen. Tänk på att det bör vara relativt korta namn annars kan det bli svårläst med mer komplexa uttryck.<br />
  - sedan data med mellanslag som separator.</p>

<p>För att hämta in en datafil används "File", "Import data...". Om det är fel i filen kommer mer eller mindre lättförståeliga felmeddelanden. Jag har inte testat så mycket att manuellt lägga in data via kalkylprogram men det ska gå.</p>

<p><br />
* "Preview Data" (och smoothing)<br />
I detta fönster man man se de olika värdena plottade i en x/y-graf. Man kan även göra en smoothing (vad jag förstår är det loess man använder), t.ex. om det är mycket brus för någon variabel.</p>

<p>* "Pick Modeling Task"<br />
Här gör man själva modellen, dvs skapar förutsättningen för uttrycket. Se även nedan under "Modellering, några exempel".</p>

<p>- Search for a formula: Här skriver man formen för uttrycket, t.ex. <br />
<code> x1 = f(x2,x3)</code>.</p>

<p>- Using building blocks: Här väljs de funktioner ("byggklossar" som man vill att Eureqa ska testa. Normal vill man alltid ha "+","-","*","/", men sedan beror det lite på vad det är för typ av data. Intressant nog är "sin" och "cos" alltid med, vilket väl speglar utvecklarnas preferens för fysiska system. Eftersom de flesta av mina datamändger inte är fysiska system brukar jag börja med att ta bort sin och cos och i stället välja t.ex. square root, exponential och logarithm, eller helt enkelt endast börja med de fyra räknesätten.</p>

<p>Det finns ett flertal andra byggstenar, t.ex. minimum, maximum, Logistic, Gaussian, Gamma, Step och Sign, man inverser och hyperboliska varianter av trigonometriska funktionerna. På forumet antyds att det kommer flera i nästa version, t.ex. de booleanska AND, OR, XOR, samt att man ska kunna definiera egna varianter.</p>

<p>Det finns även andra saker på denna sida, t.ex. att välja Fitness metric och viktningen av datapunkterna.</p>

<p>Det går också att använda flera datorer till en körning. I "Use the following servers" väljer man eventuellt andra datorer som kör en Eureqa server. Detta har jag inte testat.</p>

<p>"Seed previous solution(s)": Här kan man skriva uttryck (formler) som en vink ("bias" till Eureqa att dessa är viktiga formler.  Detta har jag inte kollat in så mycket.</p>

<p>* "Start/stop"<br />
Här startar, stoppar och pausar man en körning. Förutom dessa knappar finns en mängd annan information om hur körningen går. </p>

<p>* "Solution Results"<br />
Det är här man ser lösningen både som ett uttryck och även en graf hur bra lösningen är jämfört med de givna datapunkterna. Det är fascinerande att se den växa fram och lära sig.</p>

<p>Datamängden delas upp (automatiskt av Eureqa) innan körningen i två delar: träningsdata (train data) och valideringsdata (validation data). Sedan körs modellen på träningsdatan och valideras på valideringsdatan. Dessa två delar presenteras med olika färger här så man ser hur bra eller dåligt den valda modellen (uttrycket) passar. Mycket trevligt.</p>

<p>Olika statistiska metriker visas för respektive träning- och valideringdata:<br />
 - Fitness<br />
 - R-squared<br />
 - Correlation Coeff<br />
 - Mean Squared Error<br />
 - Mean Absolute Error<br />
 - Minimum Error<br />
 - Maximum Error</p>

<p>De flesta av dessa kan man använda som fitness metric i modelleringstabben.</p>

<p>I listan över lösningar ser man en handful lösningar som anses som mest intressanta, med den mest lovande överst. Denna lista växer dynamiskt hela tiden efter hand Eureqa hittar nya modeller. Om man klickar på en av modellerna visar både statistik och plottningen för den valda modellen. Dubbelklickar man på en formel kopieras den för att sedan klistras in i något finns program (t.ex. om man vill blogga om det).</p>

<h3>Modellering, några exempel</h3>
Här en kort beskrivning om modelleringen. Till skillnad från traditionell "curve-fitting" så skriver man inte några matematiska uttyck som ska parametriseras, utan endast vilka variabler som ska vara med i uttrycket. För dessa variabler väljs om de överhuvudtaget ska vara med samt eventuell parameter. Eureqa hittar även olika konstanter, både "globala" och inom uttryck.

<p><b>Exempel med sinus</b><br />
En av de första sakerna jag testade var att skapa en datafil med två kolumner (x och y) skapad på följande sätt (med Perl):<br />
<pre>perl -le 'for (-100..100) { print $_/100, " ", sin(2*$_/100)+3}'</pre></p>

<p>som skapar data för sambandet y = sin(2*x) + 3. De sparades i datafilen <a href="http://www.hakank.org/eureqa/sin_formula.txt">sin_formula.txt</a>. </p>

<p>Eureqa hittar lösningen efter cirka 10-15 sekunder. Notera att x motsvaras av "x0" och y av f(x0) (eller x1):<br />
<pre>  f(x0) = 3 + sin(2 * x0)</pre></p>

<p>Detta var alltså 201 datapunkter, men man behöver inte alls så mycket data för att Eureqa ska hitta en lösning.</p>

<p>En variant där man endast tar 20 slumpmässiga punkter är <a href="">sin_formula_rand20.txt</a> som är skapad genom att ta 20 punkter mellan 0 och 2*Pi:<br />
<pre>perl -le 'for (1..20) { my $x = rand(2*3.14159); print "$x ", sin(2*$x)+3}'</pre></p>

<p>Eureqa hittar 3+sin(2*x0) på cirka 30 sekunder. Det gick (denna gången i alla fall) lite långsammare eftersom det är färre punkter. Man ska dock komma ihåg att färre punkter gör att det är snabbare att kontrollera hur bra lösningen är.</p>

<p>Den viktigaste delen i modelleringen, förutom att hitta tillförlitlig data, är att hitta rätt byggstenar, dvs de matematiska funktioner som ska användas. Det bör göras med viss försiktighet och eftertanke: Om man väljer för många kan det ta väldigt lång tid och man kan får konstiga resultat. Väljer man för få så hittas inte en enkel lösning. Detta är en konst.</p>

<p><b>Fibonacci-serien</b><br />
En annan skoj sak som man kan testa är tidsserier eller data som kan ses som tidsserier. T.ex. kan Eureqa hitta en formel för Fibonacci-serien? De 25 första talen i Fibonacciserien är: 1,1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,1597,2584,4181,6765,10946.</p>

<p>För att göra detta till en lämplig representation - och som vanligt är representationen av problemet väldigt viktigt - är att man tar (tids)serien och lägger den i sekvens över flera variabler.</p>

<p>Låt oss anta att vi inte vet så mycket om denna serie, men anar att det finns en rekursivitet i serien, dvs att senare värden beror på de tidigare, normalt de omedelbart föregående (andra tidsserier, till exempel de ekonomiska kan ha andra beoenden såsom säsonger och veckodagsberoenden). </p>

<p>Här tas serien om fyra. Den första raden är <code>1,1,2,3</code>, och sedan förskjuts serien för varje rad. Hela serien finns alltså i första kolumnen.<br />
<code><br />
% | t1 t2 t3 t4 |<br />
<b>1</b> 1 2 3<br />
<b>1</b> 2 3 5<br />
<b>2</b> 3 5 8<br />
<b>3</b> 5 8 13<br />
5 8 13 21<br />
8 13 21 34<br />
13 21 34 55<br />
21 34 55 89<br />
34 55 89 144<br />
55 89 144 233<br />
89 144 233 377<br />
144 233 377 610<br />
233 377 610 987<br />
377 610 987 1597<br />
610 987 1597 2584<br />
987 1597 2584 4181<br />
1597 2584 4181 6765<br />
2584 4181 6765 10946<br />
4181 6765 10946 17711<br />
6765 10946 17711 28657<br />
10946 17711 28657 46368<br />
</code></p>

<p>Nu kan vi modellera problemet i Eureqa på följande sätt:<br />
- Formel: <code>t4 = f(t1,t2,t3)<br />
- Byggklossar: "+","-","*","/"</p>

<p>Det tar mellan 5 och 10 sekunder för Eureqa att hitta sambandet:<br />
<code>  t4 = t3 + t2</code></p>

<p>Correlation Coefficient är 1.00000, R-squared är 1 och alla error är exakt 0 så det ser helt korrekt ut. </p>

<p>Detta är skoj!</p>

<p>Man kan här notera att egentligen behövde vi ju bara de tre första variablerna t1, t2 och t3 men jag valde att ta med den extra kolumnen t4 för att inte fuska för mycket. En annan sak att notera att det är viktigt att titta på Correlation Coefficient och R-squared samt Error för att se hur bra lösningen är. </p>

<p>Nu kan man göra lite mer roliga saker. Given en lite större datamängd (<a href="http://www.hakank.org/eureqa/fib_38.txt">fib_38.txt</a>) med 38 värden kan vi kolla om Eureqa hittar några andra samband, t.ex. mellan endast två variabler t1 och t2, dvs mellan ett värde och endast de närmast föregående. Här lägger jag till funktionerna "exp", "sqrt" och "log". </p>

<p>Här är några samband som hittades i flera olika körningar. Samtliga dessa har en fitness error på 0.000 (det som i lösningstabben kallas "Error") och correlation coefficient på 1.0<br />
<code><br />
f(t1) = 1.61803*t1<br />
f(t1) = 1.61803*t1 - 0.472137/t1<br />
f(t1) = 1.61803*t1 - 1.67999/exp(t1)<br />
f(t1) = 1.61803*t1 - 1.67999/exp(t1)<br />
f(t1) = 0.809017*t1 + 0.809017*sqrt(t1)*sqrt(t1) - 0.470881/t1<br />
f(t1) = 1.61803*t1 + 0.221196/(t1*t1 - 1.61571*t1 - 1.70552)<br />
f(t1) = 1.61803*t1 + -3.39888*log(t1)/exp(t1*t1 - 1.69947)<br />
f(t1) = (1.61803*t1*t1 - 0.459213)/t1<br />
f(t1) = 1.61803*t1 - 0.440428/(t1 - 0.440428/(1.61803*t1))<br />
f(t1) = 1.61803*t1 - 0.3884/(t1 - 0.354305)<br />
</code></p>

<p>Notera att Eureqa har identifierat konstanten 1.61803 i flera av ovanstående lösningar vilket är väldigt nära <i>phi</i>, dvs "gyllene snittet" (golden ratio) = (1+sqrt(5))/2 ~ 1.6180339...). phi är precis förhållandet mellan två intilliggande Fibonaccital, så det är ju inte konstigt att Eureqa hittade detta samband. Se <a href="http://en.wikipedia.org/wiki/Fibonacci_number">Fibonacci number</a> på Wikipedia och <a href="http://www.research.att.com/~njas/sequences/A000045">Encyclopedia of Integer Sequences:A000045</a> för mycket mer info om detta.</p>

<p>Man kan säkert hitta andra <a href="http://en.wikipedia.org/wiki/Mathematical_constant">matematiska konstanter</a> om man letar vidare. <a href="http://pi.lacim.uqam.ca/">Plouffe's Inverter</a> är en guldgruva för sådant. T.ex. <a href="http://bootes.math.uqam.ca/cgi-bin/ipcgi/lookup.pl?Submit=GO+&number=1.61803&lookup_type=simple">här</a> är en sökning på konstanten 1.61803. Tyvärr är det väldigt många träffar eftersom det är så liten precision på talet.</p>

<p>Formeln <code>f(t1) = 1.61803*t1</code> är alltså en approximering av nästa tal i Fibonacci-serien, dvs F[n+1] = phi*F[n] (avrundat till heltal).</p>

<p>Ett mera avancerat exempel är om Eureqa månne  kan hitta den slutna formeln för Fibonaccital, dvs<br />
<code><br />
  F(n) = (phi^n - (1-phi)^n)/sqrt(5)<br />
</code></p>

<p>För detta krävs en ytterligare parameter i datafilen, nämligen <code>n</code>, dvs index för raden. Så här ser filen ut nu (<a href="http://www.hakank.org/eureqa/fib_50.txt">fib_50.txt"</a>), utökat till 50 rader. Den första kolumnen är alltså index.<br />
<code><br />
% | ix t1 t2 t3 t4 |<br />
1 1 1 2 3<br />
2 1 2 3 5<br />
3 2 3 5 8<br />
4 3 5 8 13<br />
...<br />
48 4807526976 7778742049 12586269025 20365011074<br />
49 7778742049 12586269025 20365011074 32951280099<br />
50 12586269025 20365011074 32951280099 53316291173<br />
</code></p>

<p>Jag vet inte riktigt hur stora tal som Eureqa kan använda, men det saknas i alla fall stöd för arbiträr precison.</p>

<p>När jag skapat filen testades först med samtliga variabler:<br />
<code><br />
  t4 = f(ix,t1,t2,t3)<br />
</code></p>

<p>Då kommer lite mer avancerade förslag än tidigare körning, samtliga med Error 0 och correlation coeff på 1.0000 (dock inte med Maximum error 0), några av dem innehåller n, dvs index.<br />
<code><br />
f(ix, t1, t2, t3) = sqrt(1.61803*t2*t3) + (t2*sqrt(t3) - t2*t2)/(sqrt(t3) - t2)<br />
</code><br />
OK, nu till problemet om den slutna formeln<br />
Formel: <code>t1 = f(ix)</code><br />
Funktioner: +,-,*,/, sqrt</p>

<p>Det vi vill ha är alltså något som liknar:<br />
<code><br />
(phi^n - (1-phi)^n)/sqrt(5)<br />
</code></p>

<p>eller snarare den numeriska motsvarigheten<br />
<code><br />
f(ix) = (1.61803^ix - (1-1.61803)^n)/2.2361<br />
      = (1.61803^ix - (-0.61803)^n)/2.2361<br />
      = 0.4472071911*1.61803^ix - 0.4472071911*(-0.61803)^ix<br />
</code><br />
(Den tredje varianten hittades via ett matematikverktyg.)</p>

<p>Intressant nog började Eureqa med lösningar där endast ix upphöjt till stora tal (t.ex. 18) samt addition, multiplikation med konstanter. Efter ett tag började experimenten med sqrt, men den körningen hittade inte skoj på många minuter så jag stoppade den.</p>

<p>För att komma runt detta testade jag "hints", dvs "Seed previous solution(s)" på "Pick Modeling Task"-tabben, genom att skriva <code>1.61803^ix</code> samt <code>sqrt(5). Då kom följande lösningar efter liten stund. De har alla korrelationskoefficient på 1, Error på 0 men stora Maximum Error.<br />
<code><br />
f(ix) = ix + 4*ix*ix*ix + 0.0256922*ix*1.58422^ix<br />
f(ix) = 0.445386*ix + 0.445386*1.61817^ix<br />
f(ix) = 0.0893707 + 0.399785*sqrt(1.61804^ix) + 0.447094*sqrt(1.61804^ix)*sqrt(1.61804^ix)<br />
f(ix) = 2*ix + 0.447097*1.61804^ix<br />
f(ix) = 0.611078*sqrt(1.62499^ix) + 0.447094*1.61804^ix - 127.933<br />
</code></p>

<p>Jag undrar dock hur "naturligt" det är för Eureqa att testa formler på formatet "konstant^variabel", så detta anser jag vara lite fusk. Däremot, om det skulle gärna mer seriösa experiment är denna typ av hintar vettiga. Då anger man vissa samband som grund, ett "alfabet" att bygga vidare på. Jag tror att mer stöd för detta kommer i senare versioner.</p>

<p>Efter detta - ska vi säga misslyckande - skippade jag hintarna och lade på funktionerna "exp", "sin", "cos" och då hittades detta samband och flera liknande, som jag faktiskt inte vet hur det ska tydas. Vad är 0.481188 för något tal i detta sammanhang?<br />
<code><br />
f(ix) = 0.447755*exp(0.481188*ix) - 0.481188*ix*ix*ix<br />
</code></p>

<p>Om man däremot lägger till funktioner "power" (och tar bort alla hintar) så kommer lösningar på formen <code>konstant^ix</code> väldigt snabbt (dvs inom en minut eller så), t.ex.<br />
<code><br />
f(ix) = 32.1653 + 0.446572*1.61809^ix<br />
</code></p>

<p>Där vi möjligen kan ana phi i konstanten 1.61809.</p>

<p>En kommentar om "power": När man väljer den i funktionslistan kommer meddelandet <i>Tip: integer powers are implemented automatically with the multiply operation. This more general power operator may not be needed for modeling the dataset.</i>. Här har vi tydligen ett fall där "power" behövs.</p>

<p>Andra lösningar i olika körningar:<br />
<code><br />
f(ix) = 1.61808^(ix - 1.67492)<br />
f(ix) = 0.0893756 + 0.399799*1.27202^ix + 0.447099*1.27202^ix*1.27202^ix<br />
f(ix) = 1.61804^(ix - 1.67287) + 1.61804^(0.478442*ix - 0.800371)<br />
f(ix) = 1.26564^(2*ix - 1.26564) + 2*ix - 1.26564<br />
f(ix) = ix + 0.447144*1.61804^ix<br />
</code><br />
(Jag har inte analyserat vidare eventuella matematiska samband...)</p>

<p>Notera att även om det är 0 i Error och 1 i korrelationskoeffient så kan det vara stora fel när man pumpar i konkreta värden. </p>

<p>En intressant lösning är följande där man möjligen kan skymta de viktiga beståndsdelarna i den slutna formeln:<br />
  - sqrt(5) ~ 2.2361<br />
  - 0.4472071911*1.61803 (från tredje varianten av den sökta formeln)<br />
<code><br />
f(ix) = 2.23642*ix + 0.447144*1.61804^ix<br />
</code></p>

<p>Mer komplexa varianter:<br />
<code><br />
f(ix) = 0.447144*1.61804^ix + 2.61804*ix*ix - (ix*ix)^(ix - 48.6408) - 48.6408*ix<br />
</code></p>

<p>Efter detta avslutade jag testet p.g.a. tidsfaktorer. </p>

<p>Slutsats: Vi hittade alltså inte formeln under dessa experiment, men vissa av sambanden kanske kan vara intressanta att studera vidare. Och så lärde vi oss det där med "power". En annan sak detta visar är att man kan vara tvungen att starta om flera gånger för att få mer aptitliga lösningar.</p>

<p><b>Derivata</b><br />
Som nämnts några gånger tidigare så har jag inte labbat så mycket med dynamiska modeller, ävenom Eureqa skapats för detta ändamål. En av anledningarna är att jag inte har så bra data tillgänglig, en annan är att de mer intressanta körningarna kan ta lång tid, i vissa fall många timmar; "över natten" är ett uttryck som används några gånger i skrifterna. </p>

<p>Som videon (se Eureqas <a href="http://ccsl.mae.cornell.edu/eureqa">hemsida</a> för länk) visar finns det möjlighet att använda derivata på följande format:<br />
<code><br />
<b>D(x1,t)</b> = f(x1,x2,t)<br />
</code><br />
och även i högerledet<br />
<code><br />
 D(x1,t) = f(x1,x2,<b>D(x2,t)</b>)<br />
</code></p>

<p>Andra derivatan skrivs på följande sätt:<br />
<code><br />
<b>D(x1,t,2)</b> = f(x1,x2,t)<br />
</code></p>

<p>Man ska dock tänka på att med derivata så krävs en preprocessing som kan ta mycket lång tid. </p>

<p>Andra modelleingsexempel  beskrivs nedan.</p>

<h3>Datafiler</h3>
Här är några av de datafiler som jag testat. För det mest är det enklare saker, och inte någon dynamisk data. De läses in med "File", "Import data...". Datafilerna finns även att tillgå på <a href="http://www.hakank.org/eureqa/">My Eureqa page</a>. 

<ul><li> <a href="http://www.hakank.org/eureqa/gelman.csv">gelman.csv</a>: Linjär regressionsexempel. 

<p>Data från Andrew Gelman's bloggpost <a href="http://www.stat.columbia.edu/~cook/movabletype/archives/2009/12/equation_search.html">Equation search, part 1</a>, <a href="http://www.stat.columbia.edu/~cook/movabletype/archives/2009/12/equation_search_1.html">Equation search, part 2</a>. Problemet beskrivs även lite mer i <a href="http://www.stat.columbia.edu/~cook/movabletype/archives/2004/11/a_linear_regres.html">A linear regression example, and a question</a>.</p>

<p>Skriv följande i Pick Modelling Task: <br />
<code>y = f(x1,x2)</code><br />
och lägg till "sqrt" som funktion.</p>

<p>En lösning är mycket riktigt<br />
<code><br />
f(x1,x2) = sqrt(x1^2+x2^2) <br />
</code><br />
Med en korrelationskoefficient på 1.0 (och det är alltså bra).</p>

<p><li> <a href="http://www.hakank.org/eureqa/planets.txt">planets.txt</a>: Keplers tredje lag</p>

<p>Detta exempel baseras på <a href="http://www.dtreg.com/gep.htm">DTREG</a>, ett annat symboliskt regressions-verktyg. Här hittas Keplers tredje lag baserat på den data som Kepler hade. Keplers tredje lag är: <br />
<code><br />
   Period^2 = Distance^3<br />
</code></p>

<p>Formel: <code>Period = f(Distance)</code><br />
Funktioner: Skippa sin och cos, lägg till square root, exp och logarithm.</p>

<p>Eureqa hittar rätt snabbt samband såsom:  <br />
<code><br />
    Period = sqrt(Distance)*Distance <br />
</code><br />
och det går snabbt.</p>

<p><li> <a href="http://www.hakank.org/eureqa/odd_parity.txt">odd_parity.txt</a><br />
En test på "paritet", men det funkar inte eftersom Eureqa än så länge saknar booleanska operatorer såsom OR, AND och XOR. Det ska komma "snart".</p>

<p><li> <a href="http://www.hakank.org/eureqa/sin_formula.txt">sin_formula.txt</a><br />
Se ovan.</p>

<p><li> <a href="http://www.hakank.org/eureqa/sin_formula2.txt">sin_formula2.txt</a><br />
Se ovan.</p>

<p><li> <a href="http://www.hakank.org/eureqa/sqrt_formula1.txt">sqrt_formula.txt</a></p>

<p>Skapad så här:<br />
<code><br />
perl -le 'for (-100..100) { print $_/100, " ", sqrt(abs(2*$_/100))+3}'<br />
</code><br />
Glöm inte att lägga till sqrt, abs och lite andra funktioner.</p>

<p><li> <a href="http://www.hakank.org/eureqa/iris.txt">iris.txt</a>: Iris data<br />
Iris är ett standardproblem (-datamängd) inom machine learning och traditionell multivariat statistisk analys. Se <a href="http://en.wikipedia.org/wiki/Iris_flower_data_set">Iris flower data set</a> (Wikipedia) för mer information. Kortfattat handlar det om att klassifiera tre olika blomtyper (Iris setosa, Iris virginica and Iris versicolor) med avseende på fyra attribut: (Sepal Length, Sepal Width, Petal Length, Petal Width). 50 mätningar gjordes för respektive blomtyp.</p>

<p>Jag tänkte att det skulle vara skoj att testa det med Eureqa också. Tyvärr klarar inte Eureqa att hantera kategorier (dvs strängrepresentation) så jag döpte om dem till "1", "2", samt "3" vilket troligen förvirrar Eureqa. En standardlösning för visssa typer av analysverktyg/-metoder som inte klarar kategorier är att i stället använda tre binära variabler som representation för de tre kategorierna. Men jag vet inte hur man får in sådant i Eureqa.</p>

<p>Jag började med att representera attributen som <code>sepallength, sepalwidth, petallength, petalwidth</code> men det blev så trångt i lösningsfönstret att jag ändrade till kortnamnen <code>sl, sw, pl, pw</code>.</p>

<p>Problemet skrivs på följande sätt<br />
<code><br />
class = f(sl, sw, pl, pw)<br />
</code></p>

<p>Första körningen, med standarduppsättningen "+","-","*","/" samt "sin" och "cos" gick inte alls bra. Men när - som experiment - jag lade till funktionerna "minimum", "maximum" och "sqrt" så hittas följande rätt snart<br />
<code><br />
   class = f(sl,sw,pl,pw) = max(1,pw + 2.20/sw)<br />
</code><br />
med en error på 0.179, fitness på -0.18, correlation coeff på 0.96, mean squared error 0.04. Traditionella metoder inom data mining/machine learning såsom beslutsträd brukar ligga ungefär där med 5-10 felklassificerade instanser.</p>

<p>Efter lite mer tuggande kommer några bättre lösningar.</p>

<p>error 0.129:<br />
<code><br />
f(sl, sw, pl, pw) = 0.975279 + min(0.624122*pw*pw, 2.02407)<br />
</code></p>

<p>error 0.124: <br />
<ode>f(sl, sw, pl, pw) = 0.926007 + min(max(0.63846*pw*pw, 0.0735181), 2.07556)</code></p>

<p>Jag är inte nöjd med detta eftersom min och max inte är så naturliga i sammanhanget och jag har inte analyserat vidare ramifikationerna av detta. Men det är ett roligt experiment. Man skulle kunna gå vidare och kontrollera vad som händer om man representerar de tre kategorierna med talen 100, 200, 300 istället, eller lägger till andra funktioner såsom sign etc.</p>

<p>Som jämförelse kan nämnas att andra metoder (t.ex. via machine learningverktyget <a href="http://www.cs.waikato.ac.nz/ml/weka/">Weka</a>) ger följande resultat, båda med ett antal felklassifikationer.</p>

<p>J48 (beslutsträd):<br />
<code><br />
petalwidth <= 0.6: Iris-setosa (50.0)<br />
petalwidth > 0.6<br />
|   petalwidth <= 1.7<br />
|   |   petallength <= 4.9: Iris-versicolor (48.0/1.0)<br />
|   |   petallength > 4.9<br />
|   |   |   petalwidth <= 1.5: Iris-virginica (3.0)<br />
|   |   |   petalwidth > 1.5: Iris-versicolor (3.0/1.0)<br />
|   petalwidth > 1.7: Iris-virginica (46.0/1.0)<br />
</pre></p>

<p><br />
JRIP (regelbaserad method):<br />
<code><br />
(petallength <= 1.9) => class=Iris-setosa (50.0/0.0)<br />
(petalwidth >= 1.7) => class=Iris-virginica (48.0/2.0)<br />
(petallength >= 5) => class=Iris-virginica (5.0/1.0)<br />
 => class=Iris-versicolor (47.0/0.0)<br />
</cpde></p>

<p>Se även min <a href="http://www.hakank.org/weka/">My Weka page</a> för mer saker om Weka.</p>

<p><li> <a href="http://www.hakank.org/eureqa/Sunspots.txt">Sunspots.txt</a>: Sunspots<br />
Solfläcksdata är ett annat standardproblem inom statistik och tidserieanalys. Tyvärr är jag lite osäker på vad denna data kommer ifrån, men det ska mätning av solfläckar på årsbasis. Så ta följande med en viss nypa salt och se det som ett generellt experiment.</p>

<p>Detta är alltså en tidsserie med 11 "förskjutna" variabler.</p>

<p>Formel <code>t11 = f(t1,t2,t3,t4,t5,t6,t7,t8,t9,t10)</code><br />
Funktioner: +,-,*,/, sin, cos</p>

<p>Notera att jag lät sin och cos vara med men de användes inte under den cirka halvtimmen jag körde (förutom några tidigare lösningar som förkastades snabbt).</p>

<p>Efter ett par minuter var följande med i listan över aktuella lösningar (avrundat till 2 decimaler):<br />
<code><br />
Error: Solution<br />
0.215: 0.65*t10 + 0.66* (t10 / (0.32+0.08*t8)<br />
0.237: 7.20+1.34*t10 - 0.58*t9<br />
0.261: 1.39*10-0.54*t9<br />
0.302: 1.91*t10-t9<br />
0.307: t10-0.19*t9<br />
0.342: 0.84*t10<br />
0.400: t10<br />
</code></p>

<p>Ingen av lösningarna är speciellt bra. Vi ser dock att t10 - inte förvånande - alltid är med, ibland t9 och vid ett tillfälle (det bästa) med t8 vilket visar att det finns någon form av beroende av tidigare värden.</p>

<p><li> <a href="http://www.hakank.org/eureqa/sin_formula_rand20.txt">sin_formula_rand20.txt</a></p>

<p>Skapad med följande:<br />
<code><br />
perl -le 'for (1..20) { my $x = rand(2*3.14159); print "$x ", sin($x)+exp($x)+3}' <br />
</code></p>

<p>Hittar följande snabbt:<br />
<code><br />
   3 + exp(x0) + sin(x0)<br />
</code></p>

<p>Testar genom att skippa sin(), men låter cos() vara kvar. Det tar en stund, sedan hittar den följande<br />
<code><br />
  3.00 + exp(x0) + cos(1.57-x0)<br />
</code></p>

<p><li> <a href="http://www.hakank.org/eureqa/boyles_law.txt">boyles_law.txt</a>: Boyles gaslag<br />
Se mer på Wikipedia <a href="http://en.wikipedia.org/wiki/Boyle%27s_law">Boyle's law</a>.</p>

<p>Detta är en klassiker i sammanhanget (dvs equation/scientific discovery), från boken Langley et.all <a href="http://www.bokus.com/b/9780262620529.html">Scientific discovery</a> (ISBN: 9780262620529, länk till Bokus), sidan 82. Boken beskriver hur systemet BACON angriper problemet. BACON är ett system med liknande intentioner som Eureqa men använder en annan teknik. Boken är för övrigt mycket intressant.</p>

<p>Eureqa hittar relativt snabbt samtliga samband (vid var sin körning):<br />
<code><br />
  PV = P*V <br />
  V = PV/P<br />
  P = PV/V<br />
</code><br />
Corelation coeff är 1 och mean error i princip 0.</p>

<p>Intressant nog kommer under körningen <code>VP=f(V,P)</code> även andra samband efter en stund:<br />
<code><br />
f(V, P) = (V*P*cos(-1*P - 1.36791) - V*P*P)/(cos(-1*P - 1.36791) - P)<br />
</code></p>

<p><li> <a href="http://www.hakank.org/eureqa/fib_25.txt">fib_25.txt</a>: Fibonacci<br />
Se ovan.<br />
<li> fib_35.txt<br />
Se ovan.</p>

<p><li> <a href="http://www.hakank.org/eureqa/catalan.txt">catalan.txt</a>: <a href="http://en.wikipedia.org/wiki/Catalan_number">Catalan-talen</a>. </p>

<p>Har inte hittat något skoj hittills, men ska nog leta vidare...</p>

<p><li> <a href="http://www.hakank.org/eureqa/not_squares.txt">not_squares.txt</a><br />
Tal som inte är kvadrater. Hittade inget skoj.</p>

<p><li> <a href="http://www.hakank.org/eureqa/primes.txt">primes.txt</a>: Primtal<br />
Detta är också en tidsserie-variant med 10 variabler för att se om något skoj samband hittas. Även här får man leta vidare.</p>

<p><li> <a href="http://www.hakank.org/eureqa/primes_with_index.txt">primes_with_index.txt</a>: Primtal med index (dvs ordningstalet för primtalet)<br />
Se ovan om primes.txt</p>

<p><li> <a href="http://www.hakank.org/eureqa/p4_gap.txt">p4_gap.txt</a>: Polynom<br />
Detta är ett av exempelproblem från <a href="http://jgap.sourceforge.net/">JGAP</a> (ett generellt genetisk programmingssystem i Java) där problemet är att hitta polynomet <code>x^4 + x^3 + x^2 - x</code>.</p>

<p>Detta tog cirka 30 sekunder att hitta denna funktion i Eureqa. Notera att jag tog bort "sin" och "cos". </p>

<p>Som jämförelse kan nämnas att JGAP-versionen tog cirka 12 minuter (vid första och enda körningen), men det är inte en rättvis jämförelse eftersom Eureqa är optimerat för denna typ av körningar. <font color="red">Uppdatering: </font>. Jag noterade att anledningen till att det tog så lång tid i JGAP var att det inte fanns några operatorer för  Add (+) eller Subtract (-) vilket ju gör problemet mycket svårare. När dessa lades till (samt Sine och Exp togs bort) tog det  cirka 10 sekunderi JGAP. JGAP är helt klart ett intressant system för genetisk programmering.</p>

<p><li> <a href="http://www.hakank.org/eureqa/p4_1.txt">p4_1.txt</a>: Polynom<br />
Jag skrev ett litet program som skapar slumpdata för polynom på formen <code>x^n+n^(n-1)+...n^2+x^1+x</code>. Sådan problem kallar jag för <code>p(n)</code> nedan.</p>

<p>Detta är alltså <code>p(4)</code>. Det tog Eureqa cirka 20 sekunder att hitta<br />
<code><br />
 p(4) =  x^4 + x^3 + x^2 + x<br />
</code><br />
baserat på 30 punkter x,y inom intervallet -5.0..5.0.</p>

<p><li> <a href="http://www.hakank.org/eureqa/p10_1.txt">p10_1.txt</a> Polynom P(10)<br />
Däremot var det lite problem med p(10) över intervallet -2.5..2.5 och 100 punkter. Jag startade om ett antal gånger efter att ha väntat - ovetenskapligt nog - "några minuter .</p>

<p>Rätt tidigt hittades x^10+x^8+x^7 men sedan tog det stopp <br />
och Eureqa började labba med x^12, t.ex. <code>(x^12-x^2)/(x^2-x)</code>.</p>

<p>En trolig förklaring till detta är att Eureqa straffar flera termer till förmån för färre.</p>

<p>Jag startade om och ändrade Fitness Metric till "Maximum Error" (på tabben "Pick Modeling Task"). Efter cirka 6 minuter hittades <br />
<code><br />
0.73*x+x^2+x^3+x^4+x^5+x^6+x^7+x^9+x^9+x^10<br />
</code><br />
med ett Maximum error på 1.76. Correlations coefficienten är 1.0000 vilket ju är bra. </p>

<p>Lösningen<br />
<code>(x^12-x^2)/(x^2-x)</code> <br />
har ett mindre felvärde för den datamängd jag testade, det var ju bara 100 punkter, så en del kan förklaras utifrån slump. </p>

<p>Jag tröttnade efter typ 20 minuter.</p>

<p><li> <a href="http://www.hakank.org/eureqa/p6_1.txt">p6_1.txt</a>: p(6)</p>

<p><li> <a href="http://www.hakank.org/eureqa/p7_1.txt">p7_1.txt</a>: p(7)</p>

<p><li> <a href="http://www.hakank.org/eureqa/circle_1_fixed.txt">circle_1_fixed.txt</a>: Cirkel</p>

<p>Detta är ett av exemplen till Eureqa, som finns att laddas ner <a href="http://www.sciencemag.org/cgi/content/full/324/5923/81/DC1">här</a>. Tyvärr är de i ett konstigt format så jag var tvungen att snygga till dem lite, härav namnet "_fixed.txt".</p>

<p>Formel: <code>x3 = f(x1,x2)</code></p>

<p>Hittar lösningen 4*sin(x1) på 20 sekunder.</p>

<p>Formal: <code>x2 = f(x1,x3)</code><br />
Hittar lösningen 4*sin(x1) på 20 sekunder.</p>

<p>Testar nu derivata:</p>

<p>Formel: <code>  D(x3,x1) = f(x1,x2)</code><br />
Lösningen verkar vara<br />
<code><br />
  dx3/dx1 = x2<br />
</code></p>

<p>Testar formeln <code>D(x3,x2) = f(x1,x2)</code><br />
Lösningen är 0 som Eureqa hittar omedelbart.</p>

<p>Formeln <code>D(x2, x1) = f(x1, x3)</code><br />
ger lösningen <code> x3</code>.</p>

</ul>

<h3>Mer om Eureqa</h3>
Här är en samling länkar om Eureqa.
<ul><li> <a href="http://ccsl.mae.cornell.edu/eureqa_download">Download page</a>
<li> <a href="http://fabathome.mae.cornell.edu/eureqa/Eureqa_User_Guide.pdf">User Guide</a>  (PDF)
<li>  <a href="http://groups.google.com/group/eureqa-group">Discussion Group</a> (google group)
<li>  <a href="http://ccsl.mae.cornell.edu/eureqa_faq">FAQ</a>
<li>  Video: "Introduction to Eurequa" finns via <a href="http://ccsl.mae.cornell.edu/eureqa">Eureqa-sidan</a>, och även på Youtube: <a href="http://www.youtube.com/watch?v=NhC1Qb-PQ5Q">Introduction to Eureqa (1/2)</a> samt <a href="http://www.youtube.com/watch?v=k7GCqfV5Uk4&feature=related">Introduction to Eureqa (1/2)</a>
<li> <a href="http://www.mae.cornell.edu/lipson/">Hod Lipon</a> och <a href="https://sites.google.com/a/cornell.edu/schmidt/">Michael Schmidt</a> är utvecklarna av Eureqa. Deras Science-artikel <a href="http://ccsl.mae.cornell.edu/sites/default/files/Science09_Schmidt.pdf">Distilling Free-Form Natural Laws from Experimental Data</a>, <a href="http://ccsl.mae.cornell.edu/sites/default/files/Science09_Schmidt_sup.pdf">supplemental materials</a> (PDF). Mer finns på Sciences sajt <a href="http://www.sciencemag.org/cgi/content/full/324/5923/81/DC1">Distilling Free-Form Natural Laws from Experimental Data, Supporting Online Material</a>, med bl.a. den data som används <a href="http://www.sciencemag.org/content/vol324/issue5923/images/data/81/DC1/invar_datasets.zip">invar_datasets.zip</a>. Som nämndes ovan är datafilerna konstiga (i alla fall i min miljö) och måste fixas till. 
</ul>

<p>Mer om symbolisk regression som är den metod Eureqa använder: <a href="http://en.wikipedia.org/wiki/Symbolic_Regression">Symbolic regression</a> (Wikipedia)</p>

<p>* Andra artiklar om Eureqa:<br />
<ul><li> Wired: <a href="http://www.wired.com/wiredscience/2009/12/download-robot-scientist/">Download Your Own Robot Scientist</a><br />
<li> Guardian: <a href="http://www.guardian.co.uk/science/2009/apr/02/eureka-laws-nature-artificial-intelligence-ai">'Eureka machine' puts scientists in the shade by working out laws of nature</a><br />
<li> Physorg.com: <a href="http://www.physorg.com/news179394947.html">Eureqa, the robot scientist (w/ Video)</a><br />
<li> Andrew Gelman (bloggar på "Statistical Modeling, Causal Inference, and Social Science"): <a href="http://www.stat.columbia.edu/~cook/movabletype/archives/2009/12/equation_search.html">Equation search, part 1</a>, <a href="http://www.stat.columbia.edu/~cook/movabletype/archives/2009/12/equation_search_1.html">Equation search, part 2</a>. <br />
</ul><br />
</p>]]>


</content>
</entry>
<entry>
<title>På Twitter: http://twitter.com/hakankj</title>
<link rel="alternate" type="text/html" href="http://www.hakank.org/webblogg/archives/001329.html" />

<modified>2009-09-17T16:47:11Z</modified>
<issued>2009-09-17T16:45:50Z</issued>

<id>tag:www.hakank.org,2009:/webblogg/1.1329</id>

<created>2009-09-17T16:45:50Z</created>
<summary type="text/plain">I dag bestämde jag mig att börja använda Twitter mer, och mer systematiskt. För tillfället innebär det primärt att jag notifierar om nya constraint programming-modeller (i stället för att vänta en vecka med att blogga om ett gäng nya modeller)...</summary>

<author>
<name>hakank</name>
<url>http://www.hakank.org/webblogg</url>

<email>hakank@bonetmail.com</email>
</author>


<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://www.hakank.org/webblogg/">
<![CDATA[<p>I dag bestämde jag mig att börja använda Twitter mer, och mer systematiskt. För tillfället innebär det primärt att jag notifierar om nya <a href="http://www.hakank.org/constraint_programming_blog/">constraint programming</a>-modeller (i stället för att vänta en vecka med att blogga om ett gäng nya modeller) och därmed relaterade saker, men även annat kan dyka upp. Det förra (constraint programming) kommer primärt att vara på engelska.</p>

<p>Min Twitter-sida är <a href="http://twitter.com/hakankj">www.twitter.com/hakankj</a>. Notera användarnamnet, med ett avslutande "j" (tyvärr var det vanliga namnet upptaget när jag registerade mig augusti 2008).<br />
</p>]]>


</content>
</entry>
<entry>
<title>The Pop-11 programming language and Poplog environment</title>
<link rel="alternate" type="text/html" href="http://www.hakank.org/webblogg/archives/001320.html" />

<modified>2009-08-31T18:29:39Z</modified>
<issued>2009-08-30T08:26:50Z</issued>

<id>tag:www.hakank.org,2009:/webblogg/1.1320</id>

<created>2009-08-30T08:26:50Z</created>
<summary type="text/plain">First I must apologize for the Swedish readers for including an english text here: Sorry about that. I may do it again, but this blog has not permanently gone English. It has, however, changed its focus somewhat in other ways...</summary>

<author>
<name>hakank</name>
<url>http://www.hakank.org/webblogg</url>

<email>hakank@bonetmail.com</email>
</author>
<dc:subject>Program</dc:subject>

<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://www.hakank.org/webblogg/">
<![CDATA[<i>First I must apologize for the Swedish readers for including an english text here: Sorry about that. I may do it again, but this blog has not permanently gone English. It has, however, changed its focus somewhat in other ways from the start in june 2003.</i>
<br><br>
Pop-11 and its environment <a href="http://www.cs.bham.ac.uk/research/projects/poplog/freepoplog.html">Poplog</a> is relatively unknown, originally designed for research and education in artificial intelligence. From <a href="http://www.cs.bham.ac.uk/research/projects/poplog/freepoplog.html#whatspoplog">What is Poplog</a>:

<blockquote>
Poplog is an integrated toolkit providing a highly extendable collection of languages and tools for teaching, research and development. By default it includes incremental compilers for three powerful AI programming languages<br>
    * Pop-11--the core language -- used to implement itself and the others;<br>
    * Common Lisp; and<br>
    * Prolog; <br>
as well as<br>
    * Standard ML, a widely used functional language. <br>
<br>
...
<br><br>
Most of Poplog is implemented in Pop-11, including the incremental compilers for all four languages and the integrated programmable editor. 
</blockquote>

Here I will mostly write about the programming language Pop-11, but also mention how it is possible to integrate Pop-11, Prolog, and Lisp. See the programs below.
<br><br>
Pop-11/Poplog is a <b>huge</b> system which includes - besides the four languages mentioned above and the VED editor which is also used for the help/teach system - much material for learning the system, as well as learning artificial intelligence. "Huge" above refers to the content of the system, not to the actual memory "footprint". For more about the size, see the entry <a href="http://www.cs.bham.ac.uk/research/projects/poplog/freepoplog.html#size">Size</a> at the Free Poplog page.
<br><br>
The language Pop-11 is Lisp-like in its approach but uses an Algol-like syntax. It has many of my favorite features of a programming language:
<ul>
  <li> interactive environment
  <li> array/list comprehension
  <li> pattern matching (on lists), and supports regular expressions
  <li> functional programming, higher order functions
  <li> multi-paradigm approach
  <li> arbitrary precision
</ul>

<h3>Some larger teaching examples</h3>
Here are some examples of the teach/help files. Many of these shows how to use a specific library, and some of them just teaches an artificial intelligence concept.
<ul>
<li> <a href="http://www.cs.bham.ac.uk/research/projects/poplog/doc/popteach/eliza">Eliza</a>, the famous Eliza program
<li> <a href="http://www.cs.bham.ac.uk/research/projects/poplog/doc/popteach/evans">Analogy/Evans</a>, Evans' Analogy program (simplified version)
<li> <a href="http://www.cs.bham.ac.uk/research/projects/poplog/packages/current/prb/teach/rulebase">Poprulebase</a>, rule based database, e.g. for expert system
<li> <a href="http://www.cs.bham.ac.uk/research/projects/poplog/doc/objectclassteach/objectclass_example">Objectclass</a>, object oriented programming
<li> <a href="http://www.cs.bham.ac.uk/research/projects/poplog/doc/popteach/database">database</a>, database for pattern matching etc
<li> <a href="http://www.cs.bham.ac.uk/research/projects/poplog/doc/popteach/matches">matcher</a>, the basic pattern matcher
<li> <a href="http://www.cs.bham.ac.uk/research/projects/poplog/doc/pophelp/super">super</a>, an extension of pattern matching in Pop-11's database 
<a href="http://www.cs.bham.ac.uk/research/projects/poplog/doc/bhamteach/super_example">super_example</a>, more about SUPER
<li> <a href="http://www.cs.bham.ac.uk/research/projects/poplog/doc/bhamteach/grammar.txt">grammar</a> analysing sentences
<li> <a href="http://www.cs.bham.ac.uk/research/projects/poplog/doc/packages/teaching/teach/solver">solver</a>: a GPS and (General Problem Solver), STRIPS like solver
<li> <a href="http://www.cs.bham.ac.uk/research/projects/poplog/doc/packages/teaching/teach/solvems">solvems</a>: another problem solving library
<li> <a href="http://www.cs.bham.ac.uk/research/projects/poplog/doc/bhamteach/storygrammar">storygrammar</a>, generation of sentences given a grammar
<li> <a href="http://www.cs.bham.ac.uk/research/projects/poplog/doc/packages/teaching/teach/schemata">schemata</a>
<li> <a href="http://www.cs.bham.ac.uk/research/projects/poplog/packages/simagent.html">SimAgent TOOLKIT</a>, 
<li> <a href="http://www.cs.bham.ac.uk/research/projects/poplog/doc/popteach/lists">lists</a>, how to use lists
</ul>

<h3>Documents and links</h3>
<ul>
<li> <a href="http://www.cs.bham.ac.uk/research/projects/poplog/freepoplog.html">Free Poplog Portal</a>
<li> <a href="http://www.cs.bham.ac.uk/research/projects/poplog/freepoplog.html#teaching">Teaching material</a>
<li> <a href="http://www.cs.bham.ac.uk/research/projects/poplog/primer/START.html">Primer</a>, probably the best way of start to learning Pop-11
<li> Robin Popplestone's <a href="http://www.cs.bham.ac.uk/research/projects/poplog/popbook/popbook.html">Pop-11 book</a> (draft)
<li> <href="http://www.math.uni.wroc.pl/~p-wyk4/thinkCS/thinkCS_1-19.pdf">How to think like a scientist</a>, draft of Pop-11 version
<li> Rosetta Code: <a href="http://www.rosettacode.org/wiki/Pop11">Pop-11</a>
<li> <a href="http://www.poplog.cs.rdg.ac.uk/">Poplog online</a>
<li> Wikipedia: <a href="http://en.wikipedia.org/wiki/POP-11">Pop-11</a>
<li> Mike Sharples, David Hogg, Chris Hutchison, Steve Torrance, David Young: <a href="http://www.cs.bham.ac.uk/research/projects/poplog/computers-and-thought/">Computers and Thought: A practical Introduction to Artificial Intelligence</a>, online book on artificial intelligence using Pop-11 as programming language
<li> comp.lang.pop <a href="http://www.cs.bham.ac.uk/research/projects/poplog/comp.lang.pop.faq.html">FAQ</a>
<li> Wikipedia: <a href="http://en.wikipedia.org/wiki/POP-11">POP-11</a>
<li> Jocelyn Paine in Dr Dobbs 'Dobbs Code Talk' (Mars 2009): <a href="http://dobbscodetalk.com/index.php?option=com_myblog&show=Poplog-continuations-Eliza-AI-education-and-Prolog.html&Itemid=29">Poplog, continuations, Eliza, AI education, and Prolog</a>
</ul>



<h3>Mailing lists</h3>
<ul>
<li> <a href="http://groups.google.com/group/comp.lang.pop/topics">comp.lang.pop</a>
<li> <a href="https://mailman.cs.bham.ac.uk/mailman/listinfo/pop-forum">pop-forum</a>
<li> <a href="https://mailman.cs.bham.ac.uk/mailman/listinfo/poplog-dev">pop-dev</a>
</ul>

<h3>My Pop-11/Poplog page</h3>
<a href="http://www.hakank.org/poplog/">My Pop-11/Poplog page</a> contains some of my Pop-11 programs. Some of them are the "mandatory" programs I always implement when learning a new programming language. 
<br><br>
Some of the program below requires functions from the <b>GOSPL</b> (Global Open Source Poplog Library) library, such as <code>split</code>, <code>split_with</code>. GOSPL was available from <a href="http://www.poplog.org/">www.poplog.org</a>, but that site seems to be defunct right now. The library is now available from <a href="http://www.cs.bham.ac.uk/research/projects/poplog/">www.cs.bham.ac.uk/research/projects/poplog/</a>, or more specific here: <a href="http://www.cs.bham.ac.uk/research/projects/poplog/gospl_1_2_0.tar.gz">gospl_1_2_0.tar.gz</a>
<br><br>

<ul>
<li> <b>init.p</b><br>
<a href="http://www.hakank.org/poplog/init.p">init.p</a>: My init.p file.
</li>
<li> <b>compiling</b><br>
<a href="http://www.hakank.org/poplog/compile_test.p">compile_test.p</a> demonstres how to:<br>
- compile a Pop-11 program to a saved (.psv) image,<br>
- compile to an executable program.<br>
Note: This was tested on a Linux machine (Mandriva).

<li> <b>Concordance</b><br>
<a href="http://www.hakank.org/poplog/concord.p">concord.p</a>: Reads a file and show the number of occurrence of the words (sorted in order of occurrence). Requires GOSPL (see above).

<li> <b>Project Euler</b><br>
 <a href="http://www.hakank.org/poplog/euler_project.p">euler_project.p</a>: My Pop-11 solutions of the first 16 <a href="http://projecteuler.net/">Euler Project</a> problems. Requires <a href="http://www.hakank.org/poplog/newmemo.p">newmemo.p</a>, and GOSPL (see below).

A note about the style in this program: When learning a programming language which has an interactive shell, I tend to use one-liners and array comprehension a lot. Especially in this case, since I used much of the principles used from my Lisp programs (using <code>loop</code> a lot).


<li> <b>join (string)</b><br>
<a href="http://www.hakank.org/poplog/join.p">join.p</a> is a small utility function to join the characters of a string. 
<br>Syntax: <code>join(string, separator)</code><br>
e.g. <code>join('hello,world','|')</code> results in <code>h|e|l|l|o|,| |w|o|r|l|d</code>. This is used for example in read_test.p.

<li> <b>Lisp in Pop-11</b><br>
 <a href="http://www.hakank.org/poplog/lisp_in_pop11_test.p">lisp_in_pop11_test.p</a> demonstrates how to run (Poplog's) Lisp code in Pop-11.

<li> <b>Grammar generation (swedish)</b><br>
<a href="http://www.hakank.org/poplog/mygram.p">mygram.p</a> generates some swedish (nonsense) sentences given a simple grammar and lexicon. It uses the GRAMMAR library (which includes a simple english grammar and lexicon).
<br><br>
The generating sentences is presented first as a parse tree, then the sentence.
<pre>
** [s [np [snp_t [det_t ett]
                 [adj_t svagt]
                 [adj_aux_t [fastän trött]]
                 [noun_t handsfack]]]
      [vp [verb [grävde ned]]
          -
          [verb_aux [utan vett och sans]]
          -
          [np [snp_n [det_n en] [noun_n buske]]]]]

;;; The sentence:
** ett svagt [fastän trött] handsfack [grävde ned] - [utan vett och sans] - en buske.

;;; Flattened
** ett svagt fastän trött handsfack grävde ned - utan vett och sans - en buske.
</pre>

Which may be translated as something like 
<pre>
a weak although tired glove department dug down - without wit or sense - a bush
</pre>

Also, see <a href="http://www.hakank.org/poplog/tparse_test_swe.p">tparse_test_swe.p</a> mentioned below for generating the parse tree from this sentence.

<li> <b>Memo function</b><br>
<a href="http://www.hakank.org/poplog/newmemo.p">newmemo.p</a> defines a Memo function (from Robin Popplestone's <a href="http://www.cs.bham.ac.uk/research/projects/poplog/popbook/popbook.html">Pop-11 book</a>) and use it for the Fibonacci sequence.

<li> <b>N-puzzle</b><br>
 <a href="http://www.hakank.org/poplog/n_puzzle.p">n-puzzle.p</a>: 8-puzzle and 15-puzzle, etc using the library SOLVEMS.

<li> <b>Pop-11 in Lisp</b><br>
<a href="http://www.hakank.org/poplog/pop11_in_lisp_test.lsp">pop11_in_lisp_test.lsp</a>: Simple demonstration how to run Pop-11 code in (Poplog's) Lisp.

<li> <b>Pop-11 in Prolog</b><br>
<a href="http://www.hakank.org/poplog/pop11_in_prolog_test.pl">pop11_in_prolog_test.pl</a>: Simple demonstration how to run Pop-11 code in (Poplog's) Prolog.

<li> <b>Prolog in Pop-11</b><br>
<a href="http://www.hakank.org/poplog/prolog_in_pop11_test.p">prolog_in_pop11_test.p</a>: Simple demonstration how to run (Poplog's) Prolog code in Pop-11.    

<li> <b>Primes / dynamic ("lazy") lists</b><br>
<a href="http://www.hakank.org/poplog/primes.p">primes.p</a> generates prime numbers using a dynamic ("lazy") list.

<li> <b>Regular expressions</b><br>
Pop-11 has regular expressions, albeit with a slighly different syntax than we are used to. The program <a href="http://www.hakank.org/poplog/read_test.p">read_test.p</a> reads a word list and test each words against the regular expressions of consecutive characters, e.g. ".*a.*.b.*c.*" (in Pop-11 'a@.@*b@.@*c@.@*'), ".*b.*c.*d.*", ".*c.*d.*e.*", etc. 

<br><br>
Using the standard Linux wordlist <code>/usr/dict/words</code> if found no word where there are 6 consecutive letters, but there are many of length 5. e.g.
<pre>
** [Testing abcde a@.@*b@.@*c@.@*d@.@*e]
** [abecedaire abecedaries abjectedness aborticide absconded abscondedly
        abscondence absconder absconders abstractedness ambuscade ambuscaded
        ambuscader ambuscades ambuscadoed amebicide amoebicide bambocciade
        bambochade carbacidometer Cerambycidae nonabstractedness Oxylabracidae
        scabicide unabstractedness]
Counter: 25

...

** [Testing qrstu q@.@*r@.@*s@.@*t@.@*u]
** [quasi-respectful quasi-respectfully]
Counter: 2

...

</pre>

Using a swedish wordlist I found some words of 6 consecutive characters.
<pre>
** [Testing klmnop k@.@*l@.@*m@.@*n@.@*o@.@*p]
** [alkoholmonopol kaliumtetracyanokuprat kaliumtetracyanoplatinat komplemento  peration kulminationspunkt vinkelmätningsmikroskop]
</pre>

This program requires <a href="http://www.hakank.org/poplog/join.p">join.p</a>.
<li><b>String matching, strmatches</b><br>
<a href="http://www.hakank.org/poplog/read_test_strmatches.p">read_test_strmatches.p</a>: Read a word list and test each words against a string pattern of consecutive characters. Same as read_test.p (see above), but uses the <a href="http://www.cs.bham.ac.uk/research/projects/poplog/auto/strmatches.p">strmatches</a> function (not in the standard Poplog distribution). This version is much slower than using regular expression. Also, see comments below about <code>strmatches</code>.

<li> <b>Solver: Banana problem</b><br>
<a href="http://www.hakank.org/poplog/solver_banana_problem.p">solver_banana_problem.p</a>: (GPS) Banana problem using SOLVER library (schema and problem from Norvig "Paradigms of Artificial Intelligence Programming").

<li> <b>Solver: Block worlds</b><br>
<a href="http://www.hakank.org/poplog/solver_blocks_world.p">solver_blocks_world.p</a>: (GPS) Blocks world problem using SOLVER library (schema and problem from TEACH SOLVER).

<li> <b>Solver: Maze problem</b><br>
<a href="http://www.hakank.org/poplog/solver_maze_problem.p">solver_maze_problem.p</a>: (GPS) Maze problem using SOLVER library (schema and problem from Norvig "Paradigms of Artificial Intelligence Programming").

<li> <b>Solver: School problem</b><br>
<a href="http://www.hakank.org/poplog/solver_school_problem.p">solver_school_problem.p</a>: (GPS) School problem using SOLVER library (schema and problem from Norvig "Paradigms of Artificial Intelligence Programming"). 

<li> <b>Timing</b><br>
<a href="http://www.hakank.org/poplog/timing_test.p">timing_test.p</a>: Two timing functions which only run the procedure <b>once</b> (as opposed to the builtin <code>timing</code> which runs many times). One definition is a syntax word, the other is a procedure proper. Includes a simple test.

<li> <b>Parsing (swedish text)</b><br>
<a href="http://www.hakank.org/poplog/tparse_test_swe.p">tparse_test_swe.p</a>: Parses (simple) swedish sentences given a simple grammar and lexicon. Uses the TPARSE library.
<br><br>
Continuing from the grammar example above:
<pre>
listparses("s", [ett svagt
                 [fastän trött]
                 handsfack
                 [grävde ned]
                 [utan vett och sans]
                 en buske])==>

** [[s [np [snp_t [det_t ett]
                  [adj_t svagt]
                  [adj_aux_t [fastän trött]]
                  [noun_t handsfack]]]
       [vp [verb [grävde ned]]
           [verb_aux [utan vett och sans]]
           [np [snp_n [det_n en] [noun_n buske]]]]]]
</pre>
</ul>

<h3>Installation</h3>
This is how I install Pop-11/Poplog when a new version arrives. I run on a linux and the current_poplog directory is a symbolic link to the actual latest distribution directory. Here I assume that the version is <code>v15.63</code>.

<ul>
<li> move the previous installation, e.g.
<pre>  rm current_poplog # this is a link
   mv v15.63 v15.63.old
</pre>
<li> Download the latest version of <code>./get-and-install-v15.63-poplog-here</code> (or whatever version) from <a href="http://www.cs.bham.ac.uk/research/projects/poplog/v15.63/#installing">http://www.cs.bham.ac.uk/research/projects/poplog/v15.63/#installing</a>.

<li> <code> chmod +x get-and-install-v15.63-poplog-here  </code>
<li> <code>./get-and-install-v15.63-poplog-here  </code>
<li> After the installation:<br>
    <code>ln -s v15.63 current_poplog</code>
<li> Fetch the latest <a href="http://www.cs.bham.ac.uk/research/projects/poplog/contrib.tar.gz">contrib.tar.gz</a><br>
  Unpack and copy in <br>
  <code>current_poplog/pop/v15.63/pop/packages/contrib/</code>

</ul>

]]>


</content>
</entry>
<entry>
<title>En uppdatering om vad som händer</title>
<link rel="alternate" type="text/html" href="http://www.hakank.org/webblogg/archives/001316.html" />

<modified>2009-08-05T18:50:56Z</modified>
<issued>2009-08-05T18:50:24Z</issued>

<id>tag:www.hakank.org,2009:/webblogg/1.1316</id>

<created>2009-08-05T18:50:24Z</created>
<summary type="text/plain">Som tidigare nämts så är det på andra bloggen My Constraint Programming Blog det händer saker numera. Vad har hänt där då (sedan maj)? Faktiskt en hel del. Jag länkar inte till alla inlägg utan endast till några &quot;high lights&quot;:...</summary>

<author>
<name>hakank</name>
<url>http://www.hakank.org/webblogg</url>

<email>hakank@bonetmail.com</email>
</author>
<dc:subject>Constraint Programming</dc:subject>

<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://www.hakank.org/webblogg/">
<![CDATA[<p>Som <a href="http://www.hakank.org/webblogg/archives/001274.html">tidigare</a> nämts så är det på andra bloggen <a href="http://www.hakank.org/constraint_programming_blog/">My Constraint Programming Blog</a> det händer saker numera. </p>

<p>Vad har hänt där då (sedan maj)? Faktiskt en hel del. Jag länkar inte till alla inlägg utan endast till några "high lights":</p>

<h4>Maj</h4>
* <a href="http://www.hakank.org/constraint_programming_blog/2009/05/report_from_sweconsnet2009_inc.html">Report from SweConsNet2009, including my presentation</a>, som alltså är en rapport från villkorsprogrammeringsworkshopen <a href="http://www.it.uu.se/research/group/astra/SweConsNet09/">SweConsNet09</a>, där jag var med och föreläste en stund. Stora delar av maj gick åt till att förebereda för denna föreläsning.

<h4>Juni</h4>
* Lyckades efter ett antal genomläsningar av några olika skrifter förstå hur det globala villkoret (global constraint) <code>cumulatives</code> funkar i Gecode, och skrev om detta i <a href="http://www.hakank.org/constraint_programming_blog/2009/06/scheduling_with_the_cumulative.html">Scheduling with the cumulatives constraint in Gecode </a>.

<p>* Publicerade och <a href="http://www.hakank.org/constraint_programming_blog/2009/06/constraint_programming_in_ecli.html">bloggade</a> om villkorsprogrammeringssystemet <a href="http://www.eclipse-clp.org/">ECLiPSe</a> (nej, det ska inte förväxlas med utveckligs-GUI:t). Det är ett riktigt trevligt Prolog-baserat system med mycket användbara utökningar såsom loopar och arrays som gör att man inte måste lösa allting med rekursioner och listor. Se vidare <a href="http://www.hakank.org/eclipse/">My ECLiPSe page</a> som nu innehåller cirka 120 modeller; till största delen har just desamma utökningar används.</p>

<h4>Juli</h4>
* Skapade ett samlingssida över de problem som modellerats i fler än ett villkorsprogrammeringssystem: <a href="http://www.hakank.org/common_cp_models/">Common constraint programming problems</a> som presenterades i <a href="http://www.hakank.org/constraint_programming_blog/2009/07/common_constraint_programming_1.html">Common constraint programming problems</a>.

<p>* Modellerade mina cirka 17 <a href="http://www.hakank.org/constraint_programming_blog/2009/04/learning_constraint_programmin_1.html">basmodeller</a> ("learning models") i ett ytterligare villkorsprogrammeringssystem: <a href="http://www.cs.st-andrews.ac.uk/~andrea/tailor/">Tailor</a>, som konverterar Essence' (ett högnivåspråk liksom t.ex. MiniZinc och Comet) till Minion, Gecode eller FlatZinc (det som MiniZinc använder). Och det var just stödet av FlatZinc inspirerade till detta.</p>

<p>Tailor presenterades i <a href="http://www.hakank.org/constraint_programming_blog/2009/07/new_tailor_version_v032_and_my.html">New Tailor version (v0.3.2) and My Essence'/Tailor page</a>. <br />
Se mera på <a href="http://www.hakank.org/tailor/">My Tailor/Essence' page</a>.</p>

<h4>Augusti, idag faktiskt</h4>
Följande når världen för första gången här, nämligen en liten MiniZinc-modell som löser <a href="http://www.strimko.com/">Strimko</a>-problem. Strimko är en mer avancerad variant av latinska kvadrater (alla rader respektive alla kolumner måste innehålla distinkta värden) där man även ska se till så att ytterligare villkor i form av en "strängar" av celler också måste vara olika. (Strimko är således inte helt väsensskilt från Sudoku.)

<p>MiniZinc-modellen är <a href="http://www.hakank.org/minizinc/strimko.mzn">strimko.mzn</a> med de tre probleminstanserna:<br />
<a href="http://www.hakank.org/minizinc/strimko_067.dzn">strimko_067.dzn</a>, <a href="http://www.hakank.org/minizinc/strimko_068.dzn">strimko_068.dzn</a> samt <a href="http://www.hakank.org/minizinc/strimko_079.dzn">strimko_070.dzn</a>.</p>

<p>Inspiration till detta var från bloggen 360: <a href="http://threesixty360.wordpress.com/2009/08/04/a-new-twist-on-latin-squares/">A New Twist on Latin Squares</a>. </p>

<p><br />
<b>Till sist, för denna gång</b><br />
För en sammanställning över de olika villkorsprogrammeringssystem jag kikat (och fortfarande kikar) på, se översiktsidan med det passande - men i någon mån förutsägbara - namnet <a href="http://www.hakank.org/constraint_programming/">My Constraint Programming Page</a>.<br />
</p>]]>


</content>
</entry>
<entry>
<title>spipat: SNOBOL/SPITBOL-patterns i C++  och Python</title>
<link rel="alternate" type="text/html" href="http://www.hakank.org/webblogg/archives/001291.html" />

<modified>2009-05-03T08:43:20Z</modified>
<issued>2009-05-03T08:42:43Z</issued>

<id>tag:www.hakank.org,2009:/webblogg/1.1291</id>

<created>2009-05-03T08:42:43Z</created>
<summary type="text/plain">spitpat är ett C/C++-bibliotek som implementerar SNOBOL/SPITBOL-patterns för C++ och Python. Så här presenteras spitpat i distributionens fil README: This is a transliteration (largely mechanincal translation) to C99 of the GNU Ada Translator (GNAT) SPITBOL.Pattern (spipat) package by Robert Dewar,...</summary>

<author>
<name>hakank</name>
<url>http://www.hakank.org/webblogg</url>

<email>hakank@bonetmail.com</email>
</author>
<dc:subject>SNOBOL/SPITBOL</dc:subject>

<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://www.hakank.org/webblogg/">
<![CDATA[<a href="http://www.snobol4.org/spipat/">spitpat</a> är ett C/C++-bibliotek som implementerar SNOBOL/SPITBOL-patterns för C++ och Python. Så här presenteras spitpat i distributionens fil README:
<blockquote>
This is a transliteration (largely mechanincal translation) to C99<br>
of the GNU Ada Translator (GNAT) SPITBOL.Pattern (spipat) package by<br>
Robert Dewar, the creator of SPITBOL GCC v3 provides all needed<br>
features.<br>
<br>
The primary goal is to enable embedding SNOBOL4 style patterns in<br>
popular scripting languages (ie; Ruby, Python, Perl, JavaScript),<br>
which are almost universally written in C.<br>
<br>
Testing and programming pattern construction in C is painful, due to<br>
the lack of operator overload.  To hasten testing, I've written a C++<br>
wrapper "Pattern" around the C spipat library.  The goal is to enable<br>
testing, and provide an experience familiar to SNOBOL programmers.  A<br>
more pure C++ approach might be to use method chaining to construct<br>
patterns, and to implement the entire package as a template that takes<br>
an arbitrary scalar type to represent a character.<br>
</blockquote>

Naturligtvis är det <a href="http://www.ultimate.com/phil/">Phil Budne</a> som gjort denna translitterering;  det är han som ligger bakom den fria SNOBOL4-implementationen <a href="http://www.snobol4.org/csnobol4/">CSNOBOL4</a> full av klockor och visslor.
<br><br>

<b>C++</b><br>
Så här kan SNOBOL/SPITBOL se ut i C++:
<pre>
#include <iostream>
#include <string>

using namespace std; 

#include <Pattern.h>

int main() {
 string subject1("Hello World!");
 string hello("Hello");
 Pattern hello_pattern(hello);
 Pattern world_pattern("World");
  
 // pattern w/ concatenation
 Pattern p1 = hello_pattern & ' ' & world_pattern;
 Pattern p2 = hello_pattern & ' ' & world_pattern & Arb();
 Pattern p3 = hello_pattern & Arb() & world_pattern;

 Matchres m1;
 cout << "p1: " << p1 << "\n";
 cout << "p2: " << p2 << "\n";
 cout << "p3: " << p3 << "\n";
 cout << "subject1 ~ p1: " << Match(subject1, p1) << "\n";
 cout << "subject1 ~ p2: " << Match(subject1, p2) << "\n";
 cout << "subject1 ~ p3: " << Match(subject1, p3) << "\n";

 return(0);
}

</pre>

<b>Pythonstöd</b><br>
Än så länge finns det - av de agila programspråken - endast stöd för Python men ovanstående antyder att det även kan komma stöd för andra programspråk. Det finns ett par exempel i distributionen, t.ex. <b>nqueens</b> där det emfatiska området är de SNOBOL-specifika delarna
<pre>
# from Victor Berstis' Minnesota SNOBOL4 distribution
# N queens problem, a string oriented version to demonstrate the power
# of pattern matching.

# translated to Python w/ spipat by Phil Budne

from spipat import *

n = 8
nm1 = n - 1
np1 = n + 1
nsz = n * np1

# This pattern tests if the first queen attacks any of the others:
<b>test = break_("Q") + "Q" + (arbno(len_(n) + "-") + len_(n) + "Q"  |
			    arbno(len_(np1) + "-") + len_(np1) + "Q" |
                            arbno(len_(nm1) + "-") + len_(nm1) + "Q")</b>
p = len_(nm1) * 'x' + len_(1)
l = "Q" + "-" * nm1 + " "

solution = 0
def solve(b):
    global solution

    if len(b) == nsz:
        solution = solution + 1
        print "Solution number", solution, "is:"
        while len(b) >= np1:
            print b[0:np1]
            b = b[np1:]
    else:
        # Add another row with a queen:
        b = l + b
        # "LOOP"
        i = 0
        while i < n:
            i += 1
            if not <b>test.match(b)</b>:
                solve(b)

            # "NEXT"
            # Try queen in next square:
            m = <b>p.match(b)</b>
            if m:
                b = <b>m.repl('-' + m.dict()['x'])</b>

solve('')
</pre



<b>Se även</b><br>
* För andra SNOBOL/SPITBOL-relaterade saker, se <a href="http://www.snobol4.org/">www.snobol4.org</a>.<br>
* David Shield har nyligen skrivit en del SNOBOL/SPITBOL-relaterat på sin blogg <a href="http://daveshields.wordpress.com/">The Wayward Word Press</a> , t.ex. <a href="http://daveshields.wordpress.com/2009/04/16/announcing-new-linkedin-group-spitbol/">Announcing New LinkedIn Group, SPITBOL </a>, <a href="http://daveshields.wordpress.com/2009/04/16/announcing-spitbol-a-new-project-hosted-at-google-code/">Announcing spitbol, a New Project Hosted at Google Code</a>.
]]>


</content>
</entry>
<entry>
<title>Karl Wettin intervjuas om Lucene and Mahout</title>
<link rel="alternate" type="text/html" href="http://www.hakank.org/webblogg/archives/001290.html" />

<modified>2009-04-28T20:08:43Z</modified>
<issued>2009-04-28T20:07:39Z</issued>

<id>tag:www.hakank.org,2009:/webblogg/1.1290</id>

<created>2009-04-28T20:07:39Z</created>
<summary type="text/plain">Karl Wettin har blivit långintervjuad i Interview with Karl Wettin on Lucene and Mahout. Grant Ingersoll talks to Karl Wettin, an Apache Lucene and Mahout Committer and independent Lucene Solr consultant. Karl talks about lexically complex European languages, using terms...</summary>

<author>
<name>hakank</name>
<url>http://www.hakank.org/webblogg</url>

<email>hakank@bonetmail.com</email>
</author>
<dc:subject>Machine learning/data mining</dc:subject>

<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://www.hakank.org/webblogg/">
<![CDATA[<p><a href="http://kodapan.se/">Karl Wettin</a> har blivit långintervjuad i <a href="http://www.lucidimagination.com/Community/Hear-from-the-Experts/Podcasts-and-Videos/Interview-Karl-Wettin">Interview with Karl Wettin on Lucene and Mahout</a>.<br />
<blockquote>Grant Ingersoll  talks to Karl Wettin, an Apache Lucene and Mahout Committer and independent Lucene Solr consultant. Karl talks about lexically complex European languages, using terms with shingles to simplify queries rather than complex span queries, and improving spellchecking with reinforcement learning, and looking at Mahout NLP.<br />
</blockquote></p>

<p>Kul, Kalle!</p>

<p>Via Clas på <a href="http://www.frisim.com/blog/2009/04/28/inuti-lucene/">Frisim</a> som faktiskt lyckades avkoda att "Wolkan Schellestum" är mitt namn.  (Jag har inte lyckats lyssna på ljudversionen; där är det kanske tydligare.)</p>

<p>Det skrevs för övrigt om Kalle anno 2003 i <a href="http://www.hakank.org/webblogg/archives/000168.html">Silvertejp</a>.<br />
</p>]]>


</content>
</entry>
<entry>
<title>Mitt föredrag på SweConsNet Workshop 2009: &quot;Learning Constraint Programming (MiniZinc, JaCoP, Choco, Gecode/R, Comet, Gecode): Some Lessons Learned&quot;</title>
<link rel="alternate" type="text/html" href="http://www.hakank.org/webblogg/archives/001285.html" />

<modified>2009-04-10T09:01:37Z</modified>
<issued>2009-04-10T08:52:36Z</issued>

<id>tag:www.hakank.org,2009:/webblogg/1.1285</id>

<created>2009-04-10T08:52:36Z</created>
<summary type="text/plain">Sedan jag startade min engelskspåkiga My Constraint Programming Blog kring årsskiftet har jag fått flera nya kontakter och haft mycket intressanta maildiskussioner. Några av dessa diskussioner har lett till att jag kommer att prata på SweConsNet Workshop 2009 27 maj...</summary>

<author>
<name>hakank</name>
<url>http://www.hakank.org/webblogg</url>

<email>hakank@bonetmail.com</email>
</author>
<dc:subject>Constraint Programming</dc:subject>

<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://www.hakank.org/webblogg/">
<![CDATA[<p>Sedan jag startade min engelskspåkiga <a href="http://www.hakank.org/constraint_programming_blog/">My Constraint Programming Blog</a> kring årsskiftet har jag fått flera nya kontakter och haft mycket intressanta maildiskussioner.</p>

<p>Några av dessa diskussioner har lett till att jag kommer att prata på <a href="http://www.it.uu.se/research/group/astra/SweConsNet09/">SweConsNet Workshop 2009</a> 27 maj 2009 i Linköping.  SweConsNet (Network for Sweden-based researchers and practitioners of Constraint programming) presenteras mer <a href="http://www.it.uu.se/research/SweConsNet">här</a> (Uppsala Universitet), workshoppen beskrivs även i bloggartikeln <a href="http://www.hakank.org/constraint_programming_blog/2009/03/sweconsnet_workshop_2009.html">SweConsNet Workshop 2009</a>.</p>

<p>Titeln på föredraget är <b>Learning Constraint Programming (MiniZinc, JaCoP, Choco, Gecode/R, Comet, Gecode): Some Lessons Learned</b> och kommer att innehålla findings funna under tiden jag kollat in och lärt mig olika constraint programming-system (och jag lär mig nya saker hela tiden), jämförelser mellan systemen och kanske ett och annat önskemål.</p>

<p>För mer om de system som kommer att tas upp, se vidare :<ul><li>  <a href="http://www.hakank.org/minizinc/">My MiniZinc page</a>, bloggarkiv <a href="http://www.hakank.org/constraint_programming_blog/minizinc/">MiniZinc</a><br />
<li> <a href="http://www.hakank.org/jacop/">My JaCoP page</a>, arkiv <a href="http://www.hakank.org/constraint_programming_blog/jacop/">JaCoP</a>.<br />
<li> <a href="http://www.hakank.org/choco/">My Choco page</a>, arkiv <a href="http://www.hakank.org/constraint_programming_blog/choco/">Choco</a>.<br />
<li> <a href="http://www.hakank.org/gecode_r/">My Gecode/R page</a>, arkiv <a href="http://www.hakank.org/constraint_programming_blog/gecoder/">Gecode/R</a>.<br />
<li> <a href="http://www.hakank.org/comet/">My Comet page</a>, arkiv <a href="http://www.hakank.org/constraint_programming_blog/comet/">Comet</a>.<br />
<li> <a href="http://www.hakank.org/gecode/">My Gecode page</a>, arkiv <a href="http://www.hakank.org/constraint_programming_blog/gecode/">Gecode</a>.<br />
</ul></p>

<p>Tiden före den specialinriktade bloggen skrevs om dessa saker (främst MiniZinc, JaCoP samt Gecode/R) på denna svenska blogg i kategorin <a href="http://www.hakank.org/webblogg/archives/cat_constraint_programming.html">Constraint programming</a>.</p>

<p>Under tiden jag förbereder föredraget planerar jag att blogga mer systematiskt kring de olika saker som kommer att tas upp. </p>

<p><br />
Not: Jag skrev ungefär samma saker häromdagen i <a href="http://www.hakank.org/constraint_programming_blog/2009/04/my_talk_at_sweconsnet_workshop_1.html">My talk at SweConsNet Workshop 2009: "Learning Constraint Programming (MiniZinc, JaCoP, Choco, Gecode/R, Comet, Gecode): Some Lessons Learned"</a>, men tyckte det kunde vara kul att skriva om det här också.<br />
</p>]]>


</content>
</entry>
<entry>
<title>Lite om vad som händer på andra bloggen: My Constraint Programming Blog</title>
<link rel="alternate" type="text/html" href="http://www.hakank.org/webblogg/archives/001274.html" />

<modified>2009-03-16T19:34:56Z</modified>
<issued>2009-03-16T19:34:43Z</issued>

<id>tag:www.hakank.org,2009:/webblogg/1.1274</id>

<created>2009-03-16T19:34:43Z</created>
<summary type="text/plain">Som tidigare nämnts är det inte här utan på My Constraint Programming Blog (&quot;Min villkorsprogrammeringsblogg&quot;) jag numera mest håller till. Här är en liten sammanfattning om vad som hänt där och i samband med detta. * En stor drös med...</summary>

<author>
<name>hakank</name>
<url>http://www.hakank.org/webblogg</url>

<email>hakank@bonetmail.com</email>
</author>
<dc:subject>Constraint Programming</dc:subject>

<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://www.hakank.org/webblogg/">
<![CDATA[<p>Som <a href="http://www.hakank.org/webblogg/archives/001259.html">tidigare</a> nämnts är det inte här utan på <a href="http://www.hakank.org/constraint_programming_blog/">My Constraint Programming Blog</a> ("Min villkorsprogrammeringsblogg") jag numera mest håller till.</p>

<p>Här är en liten sammanfattning om vad som hänt där och i samband med detta.</p>

<p>* En stor drös med Comet modeller på <a href="http://www.hakank.org/comet/">My Comet page</a>. Några exempel: <br />
  <ul><li><a href="http://www.hakank.org/comet/kenken.co">kenken.co</a> samt <a href="http://www.hakank.org/comet/kenken2.co">kenken2.co</a>: KenKen som enligt några är det nya Sudoku (det är Sudoku liknande). För mer om KenKen se Wikipedias <a href="http://en.wikipedia.org/wiki/KenKen<br />
">KenKen</a>.<br />
  <li> <a href="http://www.hakank.org/comet/kakuro.co">Kakuro</a> Kakuro och <a href="http://www.hakank.org/comet/killer_sudoku.co">Killer Sudoku</a>.<br />
  </ul><br />
* En mycket mindre drös med MiniZinc-modeller på <a href="http://www.hakank.org/minizinc/">My MiniZinc page</a>. </p>

<p>Men de modeller som tagit mest tid är följande</p>

<p><b>Nonogram</b><br />
Här är de blogganteckningarna som presenterar de olika varianterna, i normal sorterad tidordning:<br />
  1) <a href="http://www.hakank.org/constraint_programming_blog/2009/02/more_comet_models_eg_nonogram.html">More Comet models, e.g. Nonogram, Steiner triplets, and different set covering problems</a> som presenterade den första Nonogram-modellen. Långsam var den.<br />
  2) <a href="http://www.hakank.org/constraint_programming_blog/2009/02/comet_regular_constraint_a_muc_1.html">Comet: regular constraint, a much faster Nonogram with the regular constraint, some OPL models, and more</a> presenterade en mycket snabbare Nonogram-modell som använder principen bakom reguljära uttryck (villkoret <code>regular</code>).<br />
  3) samt slutligen <a href="http://www.hakank.org/constraint_programming_blog/2009/03/comet_nonogram_improved_solvin_1.html">Comet: Nonogram improved: solving problem P200 from 1:30 minutes to about 1 second</a> där jag hittade lite mer saker att förbättra, bl.a. med hjälp av en av mina husgudar <a href="http://www.cs.brown.edu/~pvh/pvhHome/Contact.html">Pascal Van Hentenryck</a> och som är en av skaparna av just Comet.</p>

<p>Ungefär samtidigt kom  jag i kontakt med gänget bakom <a href="http://www.gecode.org/">Gecode</a> (C++ baserat), det snabbate constraint programming-systemet som jag känner till. Roligt nog har de nu lagt in samma förbätring i sitt <a href="http://www.gecode.org/gecode-doc-latest/nonogram_8cpp-source.html">Nonogramprogram</a>.</p>

<p><br />
<b>Pi Day Sudoku</b><br />
I lördags var det Pi-dagen (3.14 som vissa skriver den 14 mars) och som hyllning skapade <a href="http://brainfreezepuzzles.com/main/piday2009.html">Brainfree Puzzles</a> några dagar tidigare en tävling: <a href="http://brainfreezepuzzles.com/main/piday2009.html">Pi Day Sudoku 2009</a>. Det är som vanliga Sudoku fast med knorr: förutom att det ska vara 1..9 på samtliga rader och kolumner ska det finnas exakt tre stycken Pi. Till detta kommer att man inte har de vanliga kvadratiska regionerna som kräver samma fördelning av siffror utan det är även olika former på regionerna (kolla sajten så förstår ni bättre). Jag har slutat med att lösa Sudokuproblem för hand, däremot var de speciella kriterierna ett intressant problem att modellera med villkorsprogrammering (constraint programming). </p>

<p>Första modellen, som var rätt långsam, skrevs om i <a href="http://www.hakank.org/constraint_programming_blog/2009/03/pi_day_sudoku_2009.html">Pi Day Sudoku 2009</a>. Efter lite funderande, och framförallt diskuterande med <a href="http://web.it.kth.se/~zayenz/">Mikael Zayenz Lagerkvist</a> (från sagda Gecode team), snabbades modellen upp avsevärt. Detta beskrevs i <a href="http://www.hakank.org/constraint_programming_blog/2009/03/solving_pi_day_sudoku_2009_wit.html">Solving Pi Day Sudoku 2009 with the global cardinality constraint</a>.</p>

<p>Till förfång för alla de som som söker på <a href="http://www.google.se/search?hl=sv&q=Pi+Day+Sudoku+2009&btnG=Google-s%C3%B6kning&meta=&aq=f&oq=">Pi Day Sudoku</a> har varken lösningen på problemet eller modellerna presenterats på bloggen (det blir inte förrän tävlingen är över).</p>

<p><br />
<b>Gecode 3.0.0</b><br />
Vi får ju inte heller glömma att version 3.0.0 av <a href="http://www.gecode.org/">Gecode</a> släpptes för några dagar sedan. Jag rekommenderar varmt den mycket trevliga introduktion till modellering i Gecode: <a href="http://www.gecode.org/doc-latest/modeling.pdf">Modeling with Gecode</a> (PDF).</p>

<p>I och med att version 3 har släppts kommer det inom kort även stöd för det grafiska verktyget Gist till MiniZinc, dvs när man har <a href="http://www.gecode.org/flatzinc.html">Gecode/FlatZinc</a> som lösare (och det har man alltid som förstaval). Det ser jag mycket fram emot.</p>

<p><br />
<b>Till sist: MiniZinc Challenge 2008</b><br />
Resultat av constraint programming-tävlingen <a href="http://www.g12.csse.unimelb.edu.au/minizinc/challenge.html">MiniZinc Challenge 2008</a> kom förra vecka. Inte förvånande vann Gecode. Mer om detta skrevs i <a href="http://www.hakank.org/constraint_programming_blog/2009/03/minizinc_challenge_2008_result.html">MiniZinc Challenge 2008 Results</a>.<br />
</p>]]>


</content>
</entry>
<entry>
<title>Bloggträff söndag 1 mars kl 17.00 på Kin Long i Malmö</title>
<link rel="alternate" type="text/html" href="http://www.hakank.org/webblogg/archives/001267.html" />

<modified>2009-02-28T16:15:09Z</modified>
<issued>2009-02-28T16:14:48Z</issued>

<id>tag:www.hakank.org,2009:/webblogg/1.1267</id>

<created>2009-02-28T16:14:48Z</created>
<summary type="text/plain">Söndagen den 1:a mars klockan 17.00 är det bloggträff på Kin Long i Malmö. Alla är välkomna. Meddela gärna att ni kommer så vi kan reservera bord för ungefär rätt antal. Anmäl antingen bland kommentarerna här eller via mail, hakank@bonetmail.com...</summary>

<author>
<name>hakank</name>
<url>http://www.hakank.org/webblogg</url>

<email>hakank@bonetmail.com</email>
</author>
<dc:subject>Bloggmiddagar</dc:subject>

<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://www.hakank.org/webblogg/">
<![CDATA[<p>Söndagen den 1:a mars klockan 17.00 är det bloggträff på Kin Long i Malmö. Alla är välkomna. Meddela gärna att ni kommer så vi kan reservera bord för ungefär rätt antal. Anmäl antingen bland kommentarerna här eller via mail, hakank@bonetmail.com</p>

<p>Det finns också en Facebookgrupp <a href="http://www.facebook.com/group.php?gid=47219247474">Bloggträffar i Malmöregionen</a>, öppen där alla får bli medlemmar.<br />
</p>]]>


</content>
</entry>
<entry>
<title>Constraint programming modeller i Comet</title>
<link rel="alternate" type="text/html" href="http://www.hakank.org/webblogg/archives/001259.html" />

<modified>2009-01-31T11:01:51Z</modified>
<issued>2009-01-31T11:00:00Z</issued>

<id>tag:www.hakank.org,2009:/webblogg/1.1259</id>

<created>2009-01-31T11:00:00Z</created>
<summary type="text/plain">Den senaste veckan har constraint programming (och constraint-based local search) systemet Comet kollats in. Systemet beskrivs i följande två anteckningar på My Constraint Programming Blog (det är där jag håller till mest nuförtiden): * Comet version 1.1., där finns länkar...</summary>

<author>
<name>hakank</name>
<url>http://www.hakank.org/webblogg</url>

<email>hakank@bonetmail.com</email>
</author>
<dc:subject>Constraint Programming</dc:subject>

<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://www.hakank.org/webblogg/">
<![CDATA[<p>Den senaste veckan har constraint programming (och constraint-based local search) systemet <a href="http://www.comet-online.org/Welcome.html">Comet</a> kollats in.</p>

<p>Systemet  beskrivs i följande två anteckningar på <a href="http://www.hakank.org/constraint_programming_blog/2009/01/comet_version_11.html">My Constraint Programming Blog</a> (det är där jag håller till mest nuförtiden):<br />
* <a href="http://www.hakank.org/constraint_programming_blog/2009/01/comet_version_11.html">Comet version 1.1.</a>, där finns länkar och övergrippande  information om systmet.<br />
 * I <a href="http://www.hakank.org/constraint_programming_blog/2009/01/some_comet_constraint_programm.html">Some Comet constraint programming (CP) models </a>, som innehåller kommentar om systemet, lite kodexempel samt länkar till modeller.</p>

<p>Mer information om systemet, samt några Comet-modeller finns på <a href="http://www.hakank.org/comet/">My Comet page</a>.</p>

<p>I framtiden kommer jag bl.a. att kolla in mer hur man arbetar med constraint-based local search som klarar av att lösa mycket stora problem. Detta begrepp (med Comet som exempel)  beskrivs i den trevliga och inspirerande boken <a href="http://www.bokus.com/b/9780262220774.html">Constraint-Based Local Search</a> skriven av <a href="http://www.cs.brown.edu/people/pvh/pvhHome/Contact.html">Pascal van av Hentenryck</a> and <a href="http://www.engr.uconn.edu/%7Eldm/">Laurent Michel</a> (huvudutvecklarna av Comet).<br />
</p>]]>


</content>
</entry>
<entry>
<title>Constraint programming modeller i Gecode/R (Ruby interface till Gecode)</title>
<link rel="alternate" type="text/html" href="http://www.hakank.org/webblogg/archives/001253.html" />

<modified>2009-01-16T20:01:35Z</modified>
<issued>2009-01-15T19:46:50Z</issued>

<id>tag:www.hakank.org,2009:/webblogg/1.1253</id>

<created>2009-01-15T19:46:50Z</created>
<summary type="text/plain">För er som är intresserade av (eller åtminstone nyfikna på) både constraint programming och Ruby kan jag rekommendera Gecode/R, ett mycket trevligt system Jag har den senaste tiden skapat en del Gecode/R-modeller och lagt dem på My Gecode/R page. Alldeles...</summary>

<author>
<name>hakank</name>
<url>http://www.hakank.org/webblogg</url>

<email>hakank@bonetmail.com</email>
</author>


<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://www.hakank.org/webblogg/">
<![CDATA[<p>För er som är intresserade av (eller åtminstone nyfikna på) både constraint programming och Ruby kan jag rekommendera <a href="http://gecoder.rubyforge.org/">Gecode/R</a>, ett mycket trevligt system</p>

<p>Jag har den senaste tiden skapat en del Gecode/R-modeller och lagt dem på <a href="http://www.hakank.org/gecode_r">My Gecode/R page</a>. Alldeles nyss skrevs om detta på min constraint programming blog: <a href="http://www.hakank.org/constraint_programming_blog/2009/01/some_models_in_gecoder_ruby_in.html">Some models in Gecode/R (Ruby interface to Gecode)</a>. Ni får läsa mer själva.</p>]]>


</content>
</entry>
<entry>
<title>Isomorfa ord (Isomorphic Words) - programmet </title>
<link rel="alternate" type="text/html" href="http://www.hakank.org/webblogg/archives/001248.html" />

<modified>2009-01-05T10:00:50Z</modified>
<issued>2009-01-05T10:00:00Z</issued>

<id>tag:www.hakank.org,2009:/webblogg/1.1248</id>

<created>2009-01-05T10:00:00Z</created>
<summary type="text/plain">2004 skrevs programmet Isomorphic words som söker efter isomorfa ord till ett givet källord. Programmet och begreppet &quot;isomorfa ord&quot; presenterades i Isomorfa ord (Isomorphic Words). För ett tag sedan kom en förfrågan om källkoden till programmet, varpå en CLI (Command...</summary>

<author>
<name>hakank</name>
<url>http://www.hakank.org/webblogg</url>

<email>hakank@bonetmail.com</email>
</author>
<dc:subject>Systemutveckling</dc:subject>

<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://www.hakank.org/webblogg/">
<![CDATA[<p>2004 skrevs programmet <a href="http://www.hakank.org/isomorphic_words/">Isomorphic words</a> som söker efter isomorfa ord till ett givet källord. Programmet och begreppet "isomorfa ord" presenterades  i <a href="http://www.hakank.org/webblogg/archives/000659.html">Isomorfa ord (Isomorphic Words)</a>.</p>

<p>För ett tag sedan kom en förfrågan om källkoden till programmet, varpå en CLI (Command Line Interface)-version av webb-programmet skapades. Tänkte nu att programmet likaväl kunde komma till allmänhetens fromma.</p>

<p><b>isomorphic_words.py</b><br />
Programmet <a href="http://www.hakank.org/isomorphic_words/isomorphic_words.py">isomorphic_words.py</a> är ett Pythonprogram som gör i stort sett allting som CGI-programmet gör. Syntaxen är:<br />
<code><br />
&nbsp; &nbsp; &nbsp;python  isomorphic_words.py word exact_match language <br />
</code></p>

<p>där argumenten har följande betydelse:</p>

<p>* <code>word</code>: ordet som ska isomorferas.<br />
* <code>exact_match</code>: 0 eller 1 (default 1). Om det ska göras en exakt match eller inte. Se ovanstående länkar för betydelsen av detta.<br />
* <code>language</code>: Språk, eller snarare ordlista. CLI-programmet stöder endast språk "eng" som är kopplat till ordlistan <code>/usr/dict/words</code> (standardplaceringen i Linux). Av copyright-skäl etc lämnas inte den svenska ordlistan ut.</p>

<p><br />
<b>Exempel</b><br />
Här är en exempelkörning på "ordet" (snarare strukturen) <code>abbab</code>, dvs att första och fjärde bokstäverna ska vara samma, och andra, tredje och femte bokstäverna ska vara samma. Ordlistan är <code>/usr/dict/words</code>, dvs engelska ord.<br />
 <br />
<code><br />
&nbsp; &nbsp; &nbsp;python isomorphic_words.py abbab<br />
</code></p>

<p>Med resultatet:</p>

<p><code><br />
Word: abbab<br />
Word structure of 'abbab': [0, 1, 1, 0, 1]<br />
Exact isomorphism: yes<br />
Language: english<br />
Print mappings: yes</p>

<p>beebe<br />
        2 chars: "a" -> "b"<br />
        3 chars: "b" -> "e"</p>

<p>esses<br />
        2 chars: "a" -> "e"<br />
        3 chars: "b" -> "s"</p>

<p>poopo<br />
        2 chars: "a" -> "p"<br />
        3 chars: "b" -> "o"</p>

<p>taata<br />
        2 chars: "a" -> "t"<br />
        3 chars: "b" -> "a"</p>

<p><br />
It was 4 isomorphics words to 'abbab', with exact isomorphism: yes<br />
</code></p>

<p><br />
<b>Not</b><br />
Om programmet används får det gärna refereras till ovanstående program och/eller till undertecknad.<br />
</p>]]>


</content>
</entry>
<entry>
<title>Programspråket Icon och några Project Euler problem</title>
<link rel="alternate" type="text/html" href="http://www.hakank.org/webblogg/archives/001247.html" />

<modified>2009-01-04T09:09:29Z</modified>
<issued>2009-01-04T08:53:19Z</issued>

<id>tag:www.hakank.org,2009:/webblogg/1.1247</id>

<created>2009-01-04T08:53:19Z</created>
<summary type="text/plain">Programspråket Icon och dess något mer aktiva objektorienterade dialekt Unicon (the Unified Extended Dialect of Icon) är ett underskattat språk. Tyvärr utvecklas det inte längre lika aktivt som tidigare av dess grundare (och det är säkert en orsak till underskattningen),...</summary>

<author>
<name>hakank</name>
<url>http://www.hakank.org/webblogg</url>

<email>hakank@bonetmail.com</email>
</author>
<dc:subject>Systemutveckling</dc:subject>

<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://www.hakank.org/webblogg/">
<![CDATA[<p>Programspråket <a href="http://www.cs.arizona.edu/icon/">Icon</a> och dess något mer aktiva objektorienterade dialekt <a href="http://unicon.sourceforge.net">Unicon</a> (<i>the Unified Extended Dialect of Icon</i>) är ett underskattat språk. Tyvärr utvecklas det inte längre lika aktivt som tidigare av dess grundare (och det är säkert en orsak till underskattningen), men Unicon-projektet håller fortfarande på med skoj utökningar, t.ex. en SNOBOL-liknande strängmatchning.</p>

<p>Icon/Unicon är ett trevlig programspråk med flera ganska unika egenskaper:<br />
 - strängmatchningen. Det finns stöd för reguljära uttryck via <code>regex.icn</code>, men man bör först lära känna Icons egen variant som är en utveckling av SNOBOLs patterns<br />
 - "målinriktad" programmering, där success och fail avgör programmets flöde (via t.ex. en slags backtracking)<br />
 - generatorer med <code>every</code> och "alternattion" (se mina Mankell-skriverier nedan för mer exempel)<br />
 - co-expressions (används inte här nedan)<br />
 - det har ett drag av funktionsprogramming som tilltalar mig<br />
 - det finns ett stort antal exempel och moduler</p>

<p><br />
<b>Project Euler</b><br />
Jag tänkte här inte prata så mycket om språket som visa några exempel rakt av (se referenserna nedan för mer introducerande material om språket). För detta används de tio första problemen från <a href="http://projecteuler.net/">Project Euler</a>, en sajt med veckoliga programmerings-/matematiska problem där man måste ange lösningen (i form av ett tal) för att komma vidare och läsa andras ofta kreativa lösningar (och p.g.a. detta visas endast programkoden, inte resultatet). De samlade Euler Project-problemen finns <a href="http://projecteuler.net/index.php?section=problems">här</a>. </p>

<p>Tilläggas kan att mitt Project Euler-ande började under mitt Lisp-skov för några år sedan och jag tenderar att göra åtminstone de första - säg - 20 problemen i programmeringsspråk som jag vill kolla in (såsom t.ex. Pop-11 i höstas; eventuellt kommer en snarlik bloggning om detta).</p>

<p>Nedanstående exempel antyder möjligen att Icon är ett språk för att hantera tal, vilket är lite olyckligt eftersom dess styrka snarare ligger i att hantera text/strängar (och datastrukturer). Detta sagt så skrevs flera artiklar i <a href="http://www.cs.arizona.edu/icon/analyst/ia.htm">Icon Analyst</a> om generering av olika talsekvenser.</p>

<p>Hursomhelst, här är programkoden för de 10 första Project Euler-problemen. I vissa fall visas även några (bortkommenterade) varianter av lösningar.</p>

<p><br />
<code><br />
# some libraries used<br />
link patterns, scan, factors, numbers, matrix, math</p>

<p>#<br />
# The mandatory main procedure<br />
#<br />
procedure main()</p>

<p>    problem1()<br />
    # problem2()<br />
    # problem3()<br />
    # problem4()<br />
    # problem5()<br />
    # problem6()<br />
    # problem7()<br />
    # problem8()<br />
    # problem9()<br />
    # problem10()<br />
end<br />
</code></p>

<p><b><a href="http://projecteuler.net/index.php?section=problems&id=1">Problem 1</a></b><br />
<code><br />
# If we list all the natural numbers below 10 that are multiples of 3 or 5, <br />
# we get 3, 5, 6 and 9. The sum of these multiples is 23.<br />
#<br />
# Find the sum of all the multiples of 3 or 5 below 1000.<br />
procedure problem1()<br />
  s := 0;<br />
  every s +:= mult3_or_5(1 to 999)<br />
  write(s)<br />
end</p>

<p>procedure mult3_or_5(n)<br />
  # if n % 3 == 0 | n % 5 == 0 then<br />
  if n % (3|5) == 0 then<br />
    suspend n<br />
end<br />
</code></p>

<p><br />
<b><a href="http://projecteuler.net/index.php?section=problems&id=1">Problem 2</a></b><br />
<code><br />
# Each new term in the Fibonacci sequence is generated by adding the <br />
# previous two terms. By starting with 1 and 2, the first 10 terms will be:<br />
#<br />
# 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...<br />
#<br />
# Find the sum of all the even-valued terms in the sequence which do not <br />
# exceed four million.<br />
procedure problem2()<br />
    local s := 0<br />
    every s +:= fib_test(1 to 100)<br />
    write(s)</p>

<p>end</p>

<p># For problem 2<br />
procedure fib_test(n) <br />
    if (f := fib(n)) % 2 == 0 & f < 4000000 then return f<br />
end</p>

<p>procedure fib(n)<br />
    nfib := 2;   <br />
    prevfib :=1<br />
    currfib :=1<br />
    while nfib<n do {<br />
        prevfib :=: currfib<br />
        currfib +:= prevfib<br />
        nfib +:= 1<br />
    }<br />
    return currfib<br />
end<br />
</code></p>

<p><br />
<b><a href="http://projecteuler.net/index.php?section=problems&id=1">Problem 3</a></b><br />
<code><br />
# The prime factors of 13195 are 5, 7, 13 and 29.<br />
# What is the largest prime factor of the number 600851475143 ?</p>

<p># pfactors from ipl/procs/factors.icn<br />
procedure problem3()</p>

<p>    L := pfactors(600851475143)<br />
    write(L[*L])  # write the last value</p>

<p>end<br />
</code></p>

<p><br />
<b><a href="http://projecteuler.net/index.php?section=problems&id=1">Problem 4</a></b><br />
<code><br />
# A palindromic number reads the same both ways. The largest palindrome made <br />
# from the product of two 2-digit numbers is 9009 = 91 × 99.<br />
# <br />
# Find the largest palindrome made from the product of two 3-digit numbers.<br />
procedure problem4()</p>

<p>    # Three different versions</p>

<p>    ## List solution:<br />
    # L := []<br />
    # every push(L, numeric(palindrome(string( (100 to 999) * (100 to 999)))))<br />
    # write(myMax(L))</p>

<p>    ## Hash table solution:<br />
    # H := table(0)<br />
    # every H[numeric(palindrome(string( (100 to 999) * (100 to 999))))]:=1<br />
    ## sort(H,3) sorts on values och returns a list of<br />
    ## 2*keys entries [key1, value2, key2, value2, etc]<br />
    # We want the penultimate element keyxxx in [...,keyxxx, valuexxx]<br />
    # L := sort(H,3) <br />
    # write(L[*L-1])</p>

<p>    # Set solution<br />
    local S := set()<br />
    every insert(S, numeric(palindrome(string( (100 to 999) * (100 to 999)))))<br />
    L := []<br />
    every push(L, !S)  # and converts to a list<br />
    write(myMax(L))</p>

<p>end</p>

<p>procedure myMax(L)</p>

<p>    local maximum := get(L)<br />
    every maximum <:= !L</p>

<p>    return(maximum)</p>

<p>end</p>

<p>procedure palindrome(s)<br />
    if s == reverse(s) then return s   <br />
end<br />
</code></p>

<p><br />
<b><a href="http://projecteuler.net/index.php?section=problems&id=1">Problem 5</a></b><br />
<code><br />
# 2520 is the smallest number that can be divided by each of the numbers <br />
# from 1 to 10 without any remainder.<br />
# <br />
# What is the smallest number that is evenly divisible by all of the numbers <br />
# from 1 to 20?<br />
procedure problem5()<br />
   L:= [];<br />
   every put(L, (1 to 20))<br />
   write(myLCM(L))</p>

<p>   # alternative solution using lcml from library factors.icn<br />
   # write(lcml(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20))</p>

<p>end</p>

<p><br />
# inspired by lcml in numbers.icn<br />
procedure myLCM(L)<br />
    i := get(L)<br />
    while j := get(L) do<br />
        i := lcm(i, j)</p>

<p>    return i<br />
end<br />
</code></p>

<p><br />
<b><a href="http://projecteuler.net/index.php?section=problems&id=1">Problem 6</a></b><br />
<code><br />
# The sum of the squares of the first ten natural numbers is,<br />
# 1^(2) + 2^(2) + ... + 10^(2) = 385<br />
#<br />
# The square of the sum of the first ten natural numbers is,<br />
# (1 + 2 + ... + 10)^(2) = 55^(2) = 3025<br />
# <br />
# Hence the difference between the sum of the squares of the first ten <br />
# natural numbers and the square of the sum is 3025 &#8722; 385 = 2640.<br />
# <br />
# Find the difference between the sum of the squares of the first one <br />
# hundred natural numbers and the square of the sum.<br />
procedure problem6()<br />
    L := []<br />
    sum_squares := 0;<br />
    square_sum := 0;<br />
    every put(L, (1 to 100))<br />
    every sum_squares +:= !L^2<br />
    <br />
    every square_sum +:= !L<br />
    square_sum := square_sum^2<br />
    d := square_sum - sum_squares<br />
    write(square_sum, " - ", sum_squares, " = ", d)</p>

<p>end<br />
</code></p>

<p><br />
<b><a href="http://projecteuler.net/index.php?section=problems&id=1">Problem 7</a></b><br />
<code><br />
# By listing the first six prime numbers: 2, 3, 5, 7, 11, and 13, we can see <br />
# that the 6^(th) prime is 13.<br />
# <br />
# What is the 10001^(st) prime number?<br />
procedure problem7()<br />
    local p;<br />
    # prime() is from numbers.icn and is defined thusly:<br />
    # suspend 2 | ((i := seq(3, 2)) & (not(i = (k := (3 to sqrt(i) by 2)) * (i / k))) & i)</p>

<p>    # Generate the primes and stop at the 10001:th<br />
    every p := prime() \ 10001<br />
    write(p)</p>

<p>end<br />
</code></p>

<p><br />
<b><a href="http://projecteuler.net/index.php?section=problems&id=1">Problem 8</a></b><br />
<code><br />
# Find the greatest product of five consecutive digits in the 1000-digit number.<br />
# 73167176531330624919225119674426574742355349194934<br />
# 96983520312774506326239578318016984801869478851843<br />
# 85861560789112949495459501737958331952853208805511<br />
# 12540698747158523863050715693290963295227443043557<br />
# 66896648950445244523161731856403098711121722383113<br />
# 62229893423380308135336276614282806444486645238749<br />
# 30358907296290491560440772390713810515859307960866<br />
# 70172427121883998797908792274921901699720888093776<br />
# 65727333001053367881220235421809751254540594752243<br />
# 52584907711670556013604839586446706324415722155397<br />
# 53697817977846174064955149290862569321978468622482<br />
# 83972241375657056057490261407972968652414535100474<br />
# 82166370484403199890008895243450658541227588666881<br />
# 16427171479924442928230863465674813919123162824586<br />
# 17866458359124566529476545682848912883142607690042<br />
# 24219022671055626321111109370544217506941658960408<br />
# 07198403850962455444362981230987879927244284909188<br />
# 84580156166097919133875499200524063689912560717606<br />
# 05886116467109405077541002256983155200055935729725<br />
# 71636269561882670428252483600823257530420752963450<br />
procedure problem8()<br />
   n := "7316717653133062491922511967442657474235534919493496983520312774506326239578318016984801869478851843858615607891129494954595017379583319528532088055111254069874715852386305071569329096329522744304355766896648950445244523161731856403098711121722383113622298934233803081353362766142828064444866452387493035890729629049156044077239071381051585930796086670172427121883998797908792274921901699720888093776657273330010533678812202354218097512545405947522435258490771167055601360483958644670632441572215539753697817977846174064955149290862569321978468622482839722413756570560574902614079729686524145351004748216637048440319989000889524345065854122758866688116427171479924442928230863465674813919123162824586178664583591245665294765456828489128831426076900422421902267105562632111110937054421750694165896040807198403850962455444362981230987879927244284909188845801561660979191338754992005240636899125607176060588611646710940507754100225698315520005593572972571636269561882670428252483600823257530420752963450";</p>

<p>    ## using lists<br />
    # L := []<br />
    # every i := (1 to (*n)-5 ) do {<br />
    #    s := n[i:i+5] # string segment<br />
    #    p := 1<br />
    #    every p *:= !s  # converts automatically to numbers<br />
    #    put(L, p)<br />
    # }<br />
    # write(myMax(L))</p>

<p>    # using string matching<br />
    this_max := 0<br />
    n ? {<br />
            while x := move(5) do {<br />
                move(-4)<br />
                p := product(x) <br />
                if p > this_max then<br />
                    this_max := p<br />
            }<br />
    }</p>

<p>    write("this_max: ", this_max)</p>

<p>end<br />
</code></p>

<p><br />
<b><a href="http://projecteuler.net/index.php?section=problems&id=1">Problem 9</a></b><br />
<code><br />
# A Pythagorean triplet is a set of three natural numbers, <br />
# a < b < c, for which, a^(2) + b^(2) = c^(2)<br />
# <br />
# For example, 3^(2) + 4^(2) = 9 + 16 = 25 = 5^(2).<br />
#<br />
# There exists exactly one Pythagorean triplet for which a + b + c = 1000.<br />
# Find the product abc.<br />
procedure problem9()</p>

<p>    every c := 1 to 500 & <br />
          b := 1 to c & <br />
          a := 1 to b & <br />
          a + b + c = 1000 &<br />
          a^2 + b^2 = c^2 <br />
           do {<br />
        write(a, "^2 + ", b, "^2 = ", c, "^2", " : ", a*b*c)  & fail<br />
    } <br />
end<br />
</code></p>

<p><br />
<b><a href="http://projecteuler.net/index.php?section=problems&id=1">Problem 10</a></b><br />
<code><br />
# The sum of the primes below 10 is 2 + 3 + 5 + 7 = 17.<br />
# <br />
# Find the sum of all the primes below two million.<br />
procedure problem10()<br />
    s := 0<br />
    n := 2000000</p>

<p>    every p := p10(n) & p < n & s +:= p<br />
    write(s)<br />
end</p>

<p>procedure p10(n)<br />
    # prime() from factors.icn<br />
    suspend p:= prime() do <br />
        if p > n-1 then fail<br />
end<br />
</code></p>

<p></p>

<p><b>Se även</b><br />
Tidigare skriverier om Icon:<br />
<a href="http://www.hakank.org/webblogg/archives/000650.html">Programspråket Icon och stavningen av "Henning Mankell"</a><br />
<a href="http://www.hakank.org/webblogg/archives/000651.html">Fortsatt stavning av "Henning Mankell". Samt lite om agrep</a><br />
<a href="http://www.hakank.org/webblogg/archives/000652.html">Skapa strängar från reguljära uttryck - eller: Tystnaden de senaste dagarna</a></p>

<p><br />
Huvudsajter<br />
<a href="http://www.cs.arizona.edu/icon/">Icon</a> <br />
<a href="http://unicon.sourceforge.net">Unicon</a></p>

<p><a href="http://www.cs.arizona.edu/icon/">Education</a> och där speciellt <a href="http://www.cs.arizona.edu/icon/books.htm">Books</a> där referensverken finns nedladdningsbara. Se speciellt <a href="http://www.cs.arizona.edu/icon/analyst/ia.htm">The Icon Analyst</a> var en tidskrift som innehöll intrikata artiklar om Icon såväl på bredden som på djupet.<br />
Nyhetsgruppen <a href="http://groups.google.se/group/comp.lang.icon/topics">comp.lang.icon</a> ("Låg aktivitet")</p>

<p><br />
För Unicon:<br />
<a href="http://unicon.sourceforge.net/ub/ub.pdf">The Unicon book</a> (PDF)<br />
<a href="http://sourceforge.net/mailarchive/forum.php?forum_name=unicon-group">Mailing lista</a></p>

<p>Se även Wikipediasidorna<br />
<a href="http://en.wikipedia.org/wiki/Icon_programming_language">Icon (programming language)</a><br />
<a href="http://en.wikipedia.org/wiki/Unicon_programming_language">Unicon (programming_language)</a><br />
<a href="http://en.wikipedia.org/wiki/SNOBOL">SNOBOL</a> (som för övrigt råkade ut för en liten Wikipedia-skärmytsling förra veckan).<br />
</p>]]>


</content>
</entry>

</feed>