Matt i ett drag

Låt mig först som sist dementera ett påstående som jag visserligen inte hört uttalas, men som likväl tycks utbrett: Jag kan inte Richters Schackkavalkader utantill. Det var alltså en ren slump att jag lyckades identifiera den historia som Johan Wästlund på facebook nyss[1] antydde att jag troligen skulle komma ihåg. Det slumpade sig också så att jag under någon vecka funderat på att publicera en kortare sammanfattning av lätt luriga schackliga en-dragare, och eftersom det problem som Johan tänkte på visade sig vara en sådan passade det ju utmärkt att börja med den. Så här skriver Kurt Richter på sid 144 i Schackkavalkad:

Sam Loyd, alla tiders störste problemist, tyckte ibland om att föra sina lösare bakom ljuset. J. Minckwitz meddelar följande lustiga episod:

Många »problemhajar» brukar rädda äran på följande sätt, när de missat den rätta lösningen och fått reda på den efteråt: »Ja, du förstår, vi tänkte ju att bönderna gick åt andra hållet!» Om de vetat, åt vilket håll bönderna gick, så hade de naturligtvis löst problemet i en handvändning. En dag förelade Loyd en krets av schackvänner detta problem:









Sam Loyd (1860)
Matt i 1 drag

»Matt i ett drag?» sade en av de omkringstående. »Ja, det var väl ingenting. Man behöver ju bara gå med damen till g2!» — »Det går inte», svarade Loyd, »damen är fängslad». — »Jo, det är ju sant», sade en annan, »men då kan jag väl sätta matt med ettdera av tornen». — »Tyvärr», genmälte Loyd, »går damen eller löparen emellan på tornschacken». Och så fortsatte förslagen att strömma in, man försökte Ld5+, Sf2+ och Sg3+ osv., men utan resultat. Slutligen visade Loyd den enkla lösningen: 1. bxa8D matt! »Jaså, var det alltihop det», utropade den församlade menigheten med märkbar harm, »vi trodde, att bönderna gick åt andra hållet!» — »Tänkte ni det?», inföll Loyd blixtsnabbt, »Varför satte ni inte matt med 1. b1D då?» Skallande skrattsalvor blev belöningen för detta lyckade upptåg.

Det var väl en lagom uppvärmning; jag är övertygad om att bloggens läsare är mer kompententa lösare än Loyds schackvänner, även om historien ovan bär tydliga tecken på att vara konstruerad.

På grund av en annan kommentar på facebook var jag på jakt i mitt bibliotek efter ett visst problem som jag sett för länge sedan, och jag fann det i en bok av Karl Fabel, Rund um das Schachbrett. Om du stött på namnet Fabel tidigare är det förmodligen som författare av schackproblem av typen »matt i 182 drag», »självmatt i 136 drag» eller liknande bisarrerier. Hans förkärlek för ovanlig logik gjorde att han ägnade en hel del tid åt retroproblem, det vill säga schackproblem där man måste ta reda på vad som hänt tidigare i »partiet» innan man kan bestämma sig för vad som ska hända i diagramställningen, och det är om sådana problem det huvudsakligen kommer att handla.

Några problem som drog till sig min uppmärksamhet var ett par som utnyttjade konventionerna rörande rockad och en passant som jag skrivit om en gång tidigare. Låt oss börja med den enklaste av dem:









Karl Fabel, problem 1953
Matt i 1 drag

För att kunna välja rätt mattdrag måste man veta vad svarts senaste drag var. Lång rockad duger i de flesta fallen, eftersom man efter till exempel 0… Lh4 inte kan bevisa att rockaden inte är tillåten. Efter 0… e7-e5, däremot, är rockaden inte längre tillåten, eftersom den svartfältade löparen inte kunnat lämna f8, och följaktligen måste vara promoverad, vilket bara kunnat ske på g1, från vilken ruta löparen inte kunnat tråckla sig ut utan att vits kung flyttat på sig. Återstår alltså bara att spela 1. dxe6 ep matt.

Nästa problem är ett lite mer tveksamt användande av konventionerna:









Karl Fabel, Heidelberger Tageblatt 1954
Hjälpmatt i 1 drag

Lösningen är 1.bxc3 ep 0-0-0 matt[2]. Det argument Fabel använder bygger på att det inte går att bevisa att rockad inte är tillåten, och det faktum att lösningen innehåller en rockad gör en passant-slaget legalt, eftersom vits senaste drag måste varit 0… c2-c4. Poängen är att 1… Td1, som ju ser ut att vara lika mycket matt som rockaden, inte fungerar eftersom det inte bevisar att en passant-slaget är tillåtet. Men Fabels användande av lösningen för sin retro-analys, ett slags post-retro, känns lite skakig regelmässigt; vad säger juridiskt skolade eventuella läsare? Eller är det bara min allmänna avoghet mot alla begrepp som inleds med »post-» som gör sig påmind?[3]









Karl Fabel, Welt 1949
Matt i 1 drag
a) Diagrammet
b) Ta1🠚b1

Här är det b-uppgiften som ställer till problem; för att du ska få lite tid att fundera på den tar jag ytterligare några problem innan jag förklarar hur man löser b-delen. Vill du inte vänta föreslår jag att du klickar här.

De följande problemen visar på två möjligheter att få lite mångfald i en en-dragare:









Karl Fabel, Fairy Chess Review 1939
Matt i 1 drag

Den observante läsaren frågar sig säkert var den svarte kungen befinner sig, och svaret är någonstans där det är legalt — den kan ställas på 36 rutor, och var den än ställs kan vit göra matt i ett drag.









T.R. Dawson, Fairy Chess Review 1937
Matt i 1 drag (12 ggr)

Här är betingelsen lite annorlunda — vit sätter matt i ett drag, avlägsnar därefter den mattsättande pjäsen från brädet och fortsätter på det sättet tills det inte går att hitta fler matter; tolv matter kan på detta sätt utvinnas ur ställningen. Med kravet att mattdraget ska vara unikt och utan förvandlingspjäser på brädet torde 12 matter vara maximalt antal.

Så till lösningen av problemet jag gav ovan. a-delen borde inte ställa till problem, vare sig för ignoranta eller observanta lösare — det kan inte visas att vit flyttat på någon av rockadpjäserna, så lösningen är 1. 0-0-0. Men b-delen ställer till det för de ignoranta. De noterar säkert att rockaden inte kan vara lösning längre, men missar per definition att tornplaceringen på b1 har ytterligare en effekt; de observanta upptäcker att med tornet på b1 kan inte vit vara vid draget, eftersom svart inte längre har något retrodrag (i a-delen måste spelet ha gått 0. Lb1-a2+ Kc4-d3, men nu finns inte längre den möjligheten). Alltså: 0… Kxc2 1. Dd2 matt! Elakt? Javisst! Jag kanske skulle varnat er att det kapitel i boken där jag hämtat flertalet uppgifter i den här bloggan heter »Bosheiten in Einzüger»…

Så till slut det problem jag var på jakt efter. En kommentator till ett självmattsproblem som visades på facebook hävdade, skämtsamt får man förmoda, att han var »förfärad över att vit missar matt i ett…» Nedanstående problem tillägnas därför Ola Winfridsson:









Karl Fabel, Rätselstunde 1952
Vit drar och sätter inte matt i 1 drag


Fotnoter:

  1. Det vill säga — det var nyss när jag skrev det, men på grund av min utdragna och av hemska fotbollsmatcher avbrutna skrivprocess har det gått flera dagar sedan. Jag skyller på Lee Mason… []
  2. I hjälpmatter drar som bekant svart först, och man brukar därför ange svarts drag först i notationen. []
  3. »Postkontor» känns i och för sig ganska neutralt, men är väl ett begrepp som numera tillhör det förgångna. []

Signatur och avatar

Jag har redan tidigare uppmärksammat den fantastiska blogg som drivs av Peter Olausson, signaturen Hexmaster. Här publicerar han varje dag tänkvärda saker; oftast begrundar han saker som blivit missuppfattade eller vars mening förändrats med tiden, men ibland funderar han över moderniteter i vår vardag och hur de används. Datorer och internet tillhör de ämnen som avhandlas, och för någon vecka sedan filosoferade han över hur signaturer används på internet.

Den intressantaste iakttagelsen han gör är att en signatur på nätet från början inte var avsedd att dölja en identitet, utan att framhäva den; den möjlighet till anonymitet som nuförtiden frodas, och omhuldas i vissa läger, är ett senare påfund, och ett i högsta grad tveeggat vapen.

En skugga av mitt forna jag.

Inspirerad av Hexmasters blogga tog jag mig äntligen för att registrera bilden här till höger på Gravatar. Jag har använt den tidigare, både som ikon här på bloggen och på facebook, och av uppenbara skäl tycker jag att den representerar mig väl; se bildtexten. Var bosjo kommer från har jag redan avslöjat, i min minnesartikel över min kamrat GorFo.

Bilden som sådan har en ganska exotisk bakgrund. Våren 1986 befann jag mig i Erlangen för att få fart på mina doktorandstudier, och därvid besökte jag bland annat den lokala karneval som går under namnet Bergkirchweih; i Sverige är väl »Oktoberfest» ett känt begrepp, men när jag nämnde det för någon lokal erlangenbo fnös hen bara — ett kommersiellt jippo som för länge sedan förlorat sin själ. Tacka visste hen Bergkirchweih!

I karnevalsvimlet fanns det vanliga sammelsuriet av stånd där man kunde köpa allsköns godsaker, förlora pengar på mystiska spel och annat, förutom bier und bratwurst, natürlich. Jag noterade redan tidigt ett litet oansenligt stånd, där man kunde se silhuetter av diverse kändisar, allesammans skickligt utförda. Själva klipparen, om jag får kalla honom så, stod sysslolös bredvid och betraktade folkvimlet. Men när någon kom fram för att be honom om ett porträtt, då blev det strax föreställning. Han ställde upp sin modell så att ljuset blev rätt, vred med lätt hand huvudet till rätt vinkel, plockade fram ett dubbelvikt papper och en stor sax, viftade med denna som alla konstnärer måttar med sin pensel på film, och gick sedan till verket. Under tiden hade det samlats en nyfiken skara åskådare, som med spänt intresse betraktade hans agerande. När han omsider blev klar — det tog i allmänhet bara omkring 30 sekunder — visade han stolt upp sitt verk och lät publiken jämföra den mot verklighetens modell; likheten var alltid slående. Ofta hade någon i publiken blivit tillräckligt imponerad för att ställa upp som nästa modell; och så upprepades föreställningen gång på gång tills publiken fått sitt och folksamlingen upplösts.

Jag passade på att bli »klippt» av denne virtuos en av de sista dagarna jag besökte »Berch»; 10 D-mark, dvs ca 35 kr om jag minns rätt, kostade porträttet[1]. En inskanning och lite bildbehandling för att indikera ett schackbrädesmönster; och bilden ovan var kreerad.

Som avslutning kan jag inte låta bli att citera kåsören Cellos berättelse om hur han fann sin signatur. Jag är ganska säker på att jag sett den berättelsen i ett kåseri, men för ögonblicket hittar jag inte det. Ni får i stället nöja er med den kortversion som han gav i presentationen till sitt bidrag i den första samlingen av »Saltat & pepprat» som Lasse Holmquist och Bra Böcker gav ut i början av 70-talet:

Jag fick en klocka i konfirmation. I boetten läste jag Olle C. spegelvänt. Det blev Cello. Det var ren tur alltså. Men i stället för att välsigna turen borde väl signaturen välsignat uren.


Fotnoter:

  1. Eller rättare sagt porträtten, eftersom han använde dubbelvikt papper, som alltså resulterade i två silhuetter []

Drabbad av virus

Det har varit ganska glest mellan uppdateringarna här på bloggen ett tag, och jag misstänker att åtminstone en del av min trogna läsarkrets[1] börjat frukta att jag fallit offer för något slags östasiatiskt virus. Ett sådant gjorde ju entre för dryga tiotalet år sedan, och det är detta som jag nu fallit pladask för. Men nej, jag pratar inte om Covid-19, eller någon annan covid-släkting — jag pratar om Sudoku.

Det började lite lätt med att jag någon gång under förra vintern upptäckte att The Guardian på helgerna publicerade något som de kallade »killer sudoku». Detta fenomen var åtminstone relativt nytt för mig, och jag fann snart att även om de oftast var någon nivå svårare än vanliga vanilj-sudokus, så kunde de också bjuda på mer intressanta logiska slutledningar.

Men sjukdomen bröt inte ut på allvar förrän jag i just The Guardian stötte på en artikel om ett märkligt youtube-fenomen, en kanal vid namn Cracking the Cryptic, där två distingerade engelsmän löser sudokus och andra logiska problem av varierande svårighetsgrad, från dunderknepiga till snudd på omöjliga, i realtid[2]. Den video som länkades till i artikeln behandlar en så kallad »miracle sudoku», som består av en nästan tom sudoku, där bara två(!) siffror angetts, och tre extra villkor — (1) två likadana siffror får inte placeras ett springarsteg ifrån varandra; (2) två likadana siffror får inte placeras ett kungssteg[3] ifrån varandra; och (3) två konsekutiva siffror får inte placeras i ortogonalt angränsande rutor[4]. Så här ser miraklet ut:

Erkänn att det är svårt att tro både att det finns en unik lösning, och att det i så fall går att hitta den utan datorhjälp. Men det är faktiskt inte alls så knepigt, visade det sig när man kom igång; den enda »krisen» kommer när man placerat in alla ettor och tvåor som går att placera, och måste börja placera treor — där måste man endera vara intelligent, som Simon Anthony i en video som för tillfället setts sådär 1,5 miljoner(!) gånger, eller ihärdig, som under-över-eller-var-jag-nu-är-tecknad[5].

Riktigt allvarlig blev dock inte sjukdomsbilden förrän min nyfikenhet drev mig att googla efter en sajt som CtC, som Cracking the Cryptic brukar förkortas, hämtat ett flertal av sina mest intressanta objekt från — Logic Masters Germany. Särskilt deras lista med sudokus, med variationer av alla möjliga slag fångade mig. Jag inser naturligtvis att jag inte borde sprida sjukdomen så här lättvindigt, men här kommer några av de problem som jag fastnat för. De prövas, naturligtvis, på egen risk — you have been warned…

  • Fyra små rätter. Det här är förmodligen det enklaste problemet i den här listan; det består av fyra 6*6 sudokus med lite olika interna varianter, som länkas samman av en summa där (oftast) två av de ingående delproblemen ger bidrag. Lite matematiska kunskaper skadar inte, som till exempel att triangeltalen för 5 och 6 är 15 respektive 21.
  • 144, men inte 35. Det här är likaledes förmodligen det svåraste av de här uppräknade problemen; om man inte har en matematisk överblick måste man ta hjälp av papper och penna, Notepad eller, som i mitt fall, Excel[6]. Kompositören har delat in de 81 sudoku-rutorna i sexton fem-rutiga områden (så kallade pentominos) och en överbliven ruta, samt meddelar att alla utom en har två egenskaper, förutom den »vanliga» att inga dublettsiffror är tillåtna: (1) produkten av de fem talen i pentominon är jämnt delbar med 144, och (2) produkten är inte delbar med 35. Om du till äventyrs skulle fundera på att skapa ett problem där alla 16 pentominorna följer denna enkla regel, så kommer du snart att upptäcka att den elaka verkligheten sätter upp vissa hinder i din väg. Meddela mig gärna om du lyckas, men jag hoppas du ursäktar om jag tar ett eller annat andetag under tiden.
  • Oss fyrkanter emellan. Ett annat problem med en utpräglat matematisk grundidé (enligt uppgift är kompositören en amerikansk matematiklärare). Här står kvadrater för de huvudsakliga ledtrådarna, kompletterade av några diagonalsummor som av någon anledning går under namnet »little killers».
  • En schacksudoku. Att matematik och sudoku hör samman är väl ganska naturligt, men det finns faktiskt en hel del sudokus med schackinslag också, inte bara de anti-regler som var viktiga komponenter i miraklet ovan. Det här är en av dem; nio kungar, representerade av ettor, måste skyddas från schackar av torn, löpare och springare (2,3 och 4). En intressant idé, som fått en genomgång på CtC.
  • En genial idé. Ett av de första problem jag löste på sajten, och jag prickade ett mästerverk; det är inte bara jag som tycker så — med 35 lösare har den fortfarande en ranking på 100%, en högre uppskattning är svår att få. Idén är lika enkel som genial; ett antal »mördarlådor», där summan av de två talen är exakt tio, några »termometrar, som indikerar siffror i en stigande sekvens räknat från »kvicksilverkulan», och det antispringarvillkor vi bekantade oss med i mirakelsudokun. Problemet får mig att tänka på Göran (Forslund); det här är ett problem han skulle gillat, eller till och med kunnat komponera. (Även detta problem har lösts av CtC.)
  • En golvläggarsudoku.Till slut ett problem som i skrivande stund enbart har en (officiell) lösare, och det här är ett försök att ändra på den saken. Att det bara är en lösare betyder emellertid inte att det är ett oerhört svårt problem; snarare är det en indikation på att reglerna var ganska oklart formulerade från början. Det som gjorde att jag kunde lösa den var att jag skrev en dold kommentar (dvs en kommentar som bara kommentatorn, författaren och de som löst problemet kan se) där jag förklarade mina (som det skulle visa sig felaktiga) tolkningar av reglerna, och varför jag såg mig tvungen att ge upp. Författaren förtydligade då reglerna, vilket gjorde att jag ganska raskt kunde finna lösningen. Så gör gärna ett försök att knäcka nöten; om inte annat för att det inte är varje dag som kvadratroten ur 20 innehar en viktig roll i en sudoku.

Jag hoppas att du kunnat njuta av någon eller några av dessa logiska läckerheter, utan att bli smittad av den åkomma som jag råkat utför. Tyvärr använder jag inte munskydd, men i mitt nuvarande skäggiga tillstånd lär det inte ha gjort särskilt stor nytta i alla fall.

And now for something not completely different…

För något år sedan fick jag ett så kallat ryck, och bestämde mig för att försöka lära mig något om logikprogrammering. Valet föll på Prolog eftersom jag relativt nyligen hittat en bok om detta språk på ett antikvariat[7]; någonstans i bakhuvudet fanns säkert tanken att det borde relativt lätt gå att lösa sudokus med ett sådant språk. Jag laddade också ned GNU-Prolog, och började läsa, googla och testa.

Innan jag fortsätter bör jag komma med en brasklapp av ansenliga mått; mina kunskaper i Prolog är forfarande på nybörjarnivå, och alla uppgifter om språket jag kommer att uttrycka och de programexempel jag visar bör betraktas som just synpunkter från en nybörjare i logikprogrammering, men med relativt stor erfarenhet av »traditionell» programmering.

Jag började med klassiska problem av den typ som Göran tog upp i sin problembok, och vars lösning jag avslöjade i mina errata till Görans bok. Så här ser mitt program ut:

solvetrav :- Trav = [[1,_,_],[2,_,_],[3,_,_]],
  members([[_,ptro,_],[_,gnagg,_],[_,galopp,_]],Trav),
  members([[_,_,nisse],[_,_,janne],[_,_,sven]],Trav),

  member([3,gnagg,_],Trav),
  member([2,_,sven],Trav),
  nonmember([1,_,janne],Trav),
  nonmember([_,galopp,nisse],Trav),

  write(Trav),
  nl,
  fail.

Den första raden bestämmer att lösningen (»Trav») ska vara en lista bestående av tre listor, där varje lista består av tre uppgifter; tillsammans med de två övriga raderna i det första blocket ser man att de är placeringen, hästnamnet och ägaren i den ordningen (variabeln »_» är speciell, och uttolkas »här kan du stoppa in vad du vill; jag bryr mig inte».)

Det följande kodblocket anger de uppgifter man känner till om loppet — Gnägg kom trea (det var, har jag för mig, den häst som bröt benet), Svens häst kom tvåa, Jannes häst vann inte och Nisses häst hette inte Galopp. Kommatecknen mellan uppgifterna fungerar som logiska »och»; så länge som det går att konstruera en lösning fortsätter programmet, annars backar det något eller några steg för att pröva något annat.

Det sista blocket är ett standardtrick för att finna alla möjliga lösningar; skriv ut lösningen och en ny rad, samt låtsas att det inte var den här lösningen man sökte. Jag bör kanske påpeka att »members» och »nonmember» inte är standardrutiner i Prolog, utan sådant som jag hittat på nätet, så programmet som sådant går inte att köra direkt utan att man lägger till de komponenterna.

Innan jag fortsätter känner jag mig förpliktigad att försvara mig, eller åtminstone förklara mig. När allt kommer omkring ställde jag ju i början av 90-talet upp tre enkla regler för användandet av rekursion:

  • Använd inte rekursion.
  • Använd inte rekursion!!
  • Använd rekursion då, om du absolut måste, men skyll inte på mig om det leder till kärnvapenkrig, pandemier eller att himlen trillar ned över ditt huvud.

Åkej, jag kanske inte hotade med pandemier på den tiden, men jag hoppas den allmänna avogheten mot rekursion som dessa rader är avsedda att förmedla framgår tydligt. Vad jag eventuellt inte berättade för alla som fick ta del av mina rekursionstips var den bakomliggande historien.

Under min tid som programmeringssupport vid NSC fick jag en gång ett mejl, där en person frågade varför ett visst program bara var 2-3 ggr snabbare på Crayen än på användarens arbetsstation. Programmet i fråga visade sig beräkna (om jag minns rätt) — det 40:e fibonaccitalet, uträknat med den rekursiva formel man ibland kan hitta i mindre nogräknade läromedel. Jag är fast motståndare till dödsstraff, men skulle jag tvingas ange ett brott som förtjänar ett sådant straff bör sagda läromedels författare snarast vidta åtgärder som att byta namn och skaffa lösskägg[8]. Tiotalet år senare såg jag en IT-journalist skriva något i stil med att hen testade en dator med en »tung beräkning», vilket visade sig vara en fibonacciberäkning av liknande slag.

Jag gissar att jag skulle kunna räkna ut det 40:e fibonaccitalet med papper, penna och, säg, en halvtimmes arbete; och jag försäkrar att all aritmetik jag kan utföra på en halvtimme ska en dator värd namnet klara av att utföra på mindre än en mikrosekund. Med andra ord, de 118[9] CPU-sekunder som vår Cray X-MP använde för att beräkna det 40:e fibonaccitalet hade kunnat användas till bättre ting. Som en jämförelse tog en standardkörning av mitt program för att beräkna en viss typ av spektrum för en mellanstor molekyl (ca 40-50 atomer) ca 90 CPU-sekunder på samma maskin.

Numera är jag, som kanske framgått, inte fullt lika rabiat motståndare till rekursion, och har till och med börjat använda det här och var själv, när ingen ser på. Jag har därför modifierat den tredje punkten ovan till »Det är tillåtet att använda rekursion, om du först skaffat dig 20 års erfarenhet av ett riktigt programmeringsspråk[10][11].

Det finns ett grundläggande problem här, vars existens jag för tillfället inte hittar någon författare som vågar erkänna rakt av. Det bästa jag kan erbjuda är ett citat ur Concepts of programming languages (3. ed) av Robert W. Sebesta: »One of the essential characteristics of logic programming languages is their semantics, which is called declarative semantics. The basic concept of this semantics is that there is a simple way to determine the meaning of each statement, and it does not depend on how the statement might be used to solve a problem.» Låt mig formulera om det så som jag har förstått det: »Prolog och språk av liknande typ gör att användaren bara behöver specifiera alla kända data, hur lösningen sedan ska hittas bestäms av programmet vid körningen.» Min åsikt om detta är att det uttrycker ett slags önskedröm, vars förverkligande möjligen ligger i en (avlägsen?) framtid, och att de program som för tillfället existerar kan i bästa fall ses som leksaker, som är bra på att lösa vissa typer av problem, men kräver ingående kännedom om hur programmet fungerar för att lösa dessa problem. Och detta förklarar/försvarar mitt intresse i Prolog — som pensionär är jag fri att välja mina leksaker som jag vill! SDS[12], OHS[13] och QED.

Du är inte övertygad om att Prolog är usel på att hitta lösningsmetod själv? Eller tror inte att man som programmerare kan hjälpa till? Låt mig då visa ett exempel; ganska extremt, det medges, men samtidigt hoppas jag det är illustrativt.

Problemet jag tänkte ta upp är följande, från 536 Puzzles & Curious Problems av en av alla tiders största problemmakare — Henry Dudeney. Detta är närmare bestämt nummer 393 i boken:

There is something very fascinating about star puzzles. I give an example, taking the case of the simple five-pointed star. It is required to place a different number in every circle so that the four circles in a line shall add up to 24 in all the five directions. No solution is possible with ten consecutive numbers, but you can use any whole number you like.

Och utan några alltför stora krumbukter, här kommer lösningsförslag 1, den stendumma varianten:

solvefivestar :- Numbers = [N0,N1,N2,N3,N4,N5,N6,N7,N8,N9],
  integerlist(1,18,Tal),
  member(N0,Tal),
  member(N1,Tal),
  member(N2,Tal),
  member(N3,Tal),
  member(N4,Tal),
  member(N5,Tal),
  member(N6,Tal),
  member(N7,Tal),
  member(N8,Tal),
  member(N9,Tal),
  uniquelist(Numbers),

  (N0+N5+N6+N2 =:= 24),
  (N0+N9+N8+N3 =:= 24),
  (N1+N5+N9+N4 =:= 24),
  (N1+N6+N7+N3 =:= 24),
  (N2+N7+N8+N4 =:= 24),

  write(Numbers),
  nl,
  fail.

»integerlist» och »uniquelist» är två enkla komponenter som jag skrev för att dels skapa en lista med heltal som kunde bli aktuella (som synes räknade jag bara med positiva heltal), samt att kontrollera att det inte fanns dubletter i lösningslistan. 18 valde jag efter en snabb huvudräkning, som sa att 18+1+2+3 = 24, så något tal större än 18 kunde med säkerhet inte komma ifråga i lösningmängden.

Här har jag bara deklarerat vilka tal som kan vara aktuella, och vilka relationer som gäller mellan dem, utan några krusiduller. När jag körde programmet hände dock ingenting. Jag vill minnas att jag bröt efter så där en och en halv timma, och då hade programmet inte ens hittat en enda lösning. Jag kan visserligen utesluta möjligheten av att den fortfarande skulle ha letat om jag inte tryckt på ctrl-c, men det beror mer på att den dator den körde på säckade ihop för gott för en månad sedan.

Skam den som ger sig. Jag misstänkte naturligtvis att den algoritm som programmet använde i princip kunde betecknas som 10 for-loopar inuti varandra, och det kunde ju förklara varför den tog så lång tid på sig. Ett rimligt försök att snabba upp beräkningen borde då vara att presentera de begränsande villkoren så snart som möjligt. Denna tanke ledde till detta detta program, med lite mänsklig hjälp:

solvefivestar(Const) :- Numbers = [N0,N1,N2,N3,N4,N5,N6,N7,N8,N9],
  integerlist(1,18,Tal),
  member(N0,Tal),
  member(N2,Tal),
  member(N5,Tal),
  (N6 is Const -(N0+N2+N5)),
  member(N6,Tal),
  member(N3,Tal),
  member(N8,Tal),
  (N9 is Const -(N0+N3+N8)),
  member(N9,Tal),
  member(N1,Tal),
  (N4 is Const -(N1+N5+N9)),
  member(N4,Tal),
  (N7 is Const -(N1+N6+N3)),
  member(N7,Tal),
  uniquelist(Numbers),
  (N2+N7+N8+N4 =:= Const),

  write(Numbers),
  nl,
  fail.

Som synes är detta program inte lika enkelt att förstå som förra försöket; i stället för ett block med deklarationer och ett med relationer, så har jag den här gången introducerat relationerna så tidigt som möjligt för att begränsa de nödvändiga looparna. Och resultatet är över förväntan; på min gamla dator, den som säckade ihop, spottade den ut ett par skärmsidor lösningar på lite drygt sex sekunder, och ersättaren, den som jag använder nu, tar bara 4.5 sekunder på sig. En remakaber[14] skillnad, eller hur?

Nu är jag naturligtvis inte den förste som noterat att Prolog inte är särskilt bra på den här typen av problem. Jag hittade en artikel på nätet som beklagade sig över att man fortfarande lärde ut ”is” och aritmetisk likhet (=:=), när det fanns så mycket bättre möjligheter (om jag minns rätt kallade författaren det hela för constraint programming over finite domains, vilket jag inte vågar mig på att försöka översätta). Idéerna i artikeln resulterade i följande program:

solvefivestarcp(Const) :- Numbers = [N0,N1,N2,N3,N4,N5,N6,N7,N8,N9],
  fd_domain(Numbers,1,18),
  fd_all_different(Numbers),

  N0+N5+N6+N2 #= Const,
  N0+N9+N8+N3 #= Const,
  N1+N5+N9+N4 #= Const,
  N1+N6+N7+N3 #= Const,
  N2+N7+N8+N4 #= Const,

  fd_labeling(Numbers),

  write(Numbers),
  nl,
  fail.

Lägg märke till den strukturella likheten med mitt första, stendumma, försök; först tala om hur lösningen bör se ut, sedan villkoren. Och för den som är bekant med Sidney Harris’ klassiska teckning, det är i fd_labeling miraklet sker — där används den givna informationen på något intelligent sätt; min nya dator behöver nu bara en kvarts sekund på sig för att lista alla lösningar.

Jag hoppas detta exempel visar att det fortfarande är viktigt att veta vad man pysslar med — att skriva in data och regler/relationer, för att sedan låta maskinen överta alla beräkningar är än så länge bara en dröm.

Låt mig avsluta med att begå det brott jag tidigare yrkade på dödstraff för, men i en form som förvisso inte meriterar en så hård påföljd. Jag har nämligen sedan någon månad tillbaka övergått till en av Prologs efterföljare, Picat, som tagit med sig många av de goda sidorna i Prolog, och samtidigt rättat till en del av missarna. Så här försöker man fixa till fibonacci-problemet (från boken »Constraint Solving and Planning with Picat», som kan laddas ner som en PDF-fil från sajten i länken ovan).

table
fib(1) = 1.
fib(2) = 1.
fib(N) = F, N > 2 => F = fib(N-1)+fib(N-2).

Det som räddar författarna (och mig) från galgen är ordet »table»; detta anger att resultat ska cachas, vilket enligt författarna förvandlar beräkningstiden från exponentiell till linjär. Jag har inte undersökt detta närmare, men det låter underligt i mina öron. Om resultatet cachas fullt ut, borde beräkningstiden vara konstant om resultatet fanns i cachen, linjärt om det måste beräknas. Men hur som helst kommer man inte ifrån att rekursion kräver utrymme på stacken, så även om rekursionen i det här fallet är acceptabel, så är det inte det bästa sättet att utföra beräkningen. SDS.


Fotnoter:

  1. Här antar jag alltså att en sådan existerar, vilket naturligtvis är mer baserat på en önskedröm än något slags verklighetsunderlag. []
  2. Det händer dock att verkligheten tränger sig på och genererar ett avbrott, och en gång har till och med en av dem gjort en miss och tvingats ge upp (för att sedan i ett tillägg förklara sin miss och korrigera den). []
  3. Egentligen räcker det ju att säga ett ferssteg ifrån varandra, eftersom kungens raka stegmöjlighet redan är förbjuden med standardsudokuregler. []
  4. eller ett vesir-steg från varandra, om vi ska fortsätta med (fantasi)schackpjäs-terminologin []
  5. Inte första gången, och antagligen inte sista, där den stupida envishet jag understundom kan utveckla kan misstolkas som ett utslag av intelligens. []
  6. Eller, för att vara mer exakt, Calc, Libreoffice’ klon av Excel. []
  7. Det är nu inte hela sanningen, eftersom min boksamling även innehåller en bok om LISP, men jag vill ju inte framstå som en person som gör saker lite slumpartat, så därför måste jag uppfinna ett skäl för mitt handlande. []
  8. Detta senare försök att förändra utseendet kan dock verka misstänkt på eventuella kvinnliga fibonaccirekursionister, så dessa bör nog försöka andra förklädnader. []
  9. Jag är inte säker på det exakta antalet, men mitt undermedvetna propsar på att skicka fram detta tal. Det är i alla fall inte helt taget ur luften. []
  10. Och med ett »riktigt programmeringsspråk» avses naturligtvis Fortran. []
  11. Det betyder visserligen att jag inte skulle vara berättigad att använda rekursion än, så jag har för mitt samvetes skull lagt till att tre års Pascal-programmering må i särskilt behjärtansvärda fall få ersätta ett års »riktig» programmering. []
  12. Så Det Så []
  13. Och Hör Sedan []
  14. Nej, jag har inte stavat fel; jag kunde bara inte bestämma mig för om skillnaden var makaber eller remarkabel, så jag skapade ett nytt ord. []

Potatissallad provinçale

Mina recept, del 6

Det är egendomliga tider vi lever i, i synnerhet för tillfället. Jag tänker då i första hand varken på den pågående pandemin, det faktum att den förkortning jag förknippar med Bonniers Litterära Magasin fått en ny och allvarligare mening, eller på den allmänna överraskningen att vi tycks få något som liknar en sommar i år. Nej, egotrippad som jag är syftar jag på att de råd som för tillfället delas ut skulle kunna förkortas »gör som bosjo gör» — även utan pandemier och sommarvärme undviker jag helst folkmassor, handlar på tider då normala människor sover sin skönhetssömn, och gör så lite som möjligt. Min förhoppningsvis tillfälliga karriär som stilbildare och »role model» är jag inte så bekväm med, så jag hoppas att världen snart återgår till ett mer normalt beteende.

Men det är inte om värme- eller sjukdoms-böljor som den här bloggan ska handla, utan om en maträtt som jag blivit påmind om av den just timade näst viktigaste högtid som infaller under sommarmånaderna. Den viktigaste är naturligtvis fortfarande julaftonen den tredje söndagen i augusti. Min förmodan att den skulle upphöra var visserligen delvis korrekt, men den har de senaste åren levt vidare under lite andra former. I år blir det dock ingen julafton, vilket tycks bero både på pandemiska och ekonomiska problem.

Desto större anledning att vara tacksam för föregående vecka, den som går under kodbeteckningen »gratis-potatis-veckan» — inte nog med att man då normalt kan köpa färsk potatis till överkomliga priser för första gången på året, handlare slåss om att kunna erbjuda de billigaste knölarna. Här i byn var ICA billigast av de butiker jag besökte, 49 öre kilot[1], vilket, om jag minns rätt, var oförändrat jämfört med förra året, medan däremot Willys bidrog med vad som i sammanhanget kan betraktas som en chockhöjning — två och nittio, jämfört med förra årets 69 öre.

Potatissallad provinçale

Potatis, ca 800-900 g
1 lök
1 knippe rädisor
5 msk olivolja
4 msk vinäger
2-3 msk stark (dijon)senap, helst »Senap Provençale»
3 msk kapris
2 msk hackad persilja
2 msk hackad gräslök
salt
peppar
 
Tillagning: Koka potatisen mjuk på vanligt sätt; låt den svalna ett tag. Hacka löken fint, skiva rädisorna och ansa om nödvändigt kaprisen; lägg resultatet i en skål, tillsätt allt utom potatisen och blanda väl. Skär till sist ner den kokta potatisen i vinägretten i lagom stora bitar — mitt max-mått är en-och-en-halv cm, ungefär — och blanda noga. Kan serveras direkt, men blir enligt min mening ännu bättre om den får stå några timmar i kylen. Passar till det mesta, till exempel grillat kött.

Några kommentarer: Grunden till receptet ovan finns här, men som synes har jag fipplat lite med detaljerna. Framför allt är det rädisorna och gräslöken som kommit till, men utan att det syns på pappret så ser jag till att mängden lök är rejäl — »en lök» betyder i min bok »en riktigt stor lök», och har man ingen sådan får man ta ett par, tre mindre lökar. Även mängden kapris kan variera, och någon gång då potatismängden var i minsta laget stoppade jag dit en handfull gröna oliver; det fungerade också bra.

Om man är lite väl »het på potatisen», så är det lätt hänt att den mosar sig vid blandningen; detta påverkar dock inte smaken i någon nämnvärd grad[2], men förtar det visuella intrycket en smula, om man inte gillar anblicken av grovt potatismos. En erfarenhet är att det går alldeles utmärkt att göra iordning salladen dagen innan, men att det då kan vara idé att vänta med att blanda i rädisorna till strax före serveringen; annars kan de börja se »trötta» ut.

Till slut några tankar kring själva »musten», vinägretten — det vill säga oljan, vinägern och senapen. Som synes har jag i stort följt originalreceptet, men med tanken att jag vid tillfälle ska undersöka lite andra möjligheter. Nästan alla liknande recept jag har sett har betydligt större andel olja, och en tysk översättning av en fransk matlagningsbok som jag införskaffade för ett par evigheter sedan hävdar att förhållandet bör vara två till ett, dubbelt så mycket olja som vinäger. Eftersom jag inte haft någon anledning att klaga på smaken har jag bara protesterat en aning diskret genom att låta oljan skvätta över lite grann så att de måtten varit tämligen rågade, medan vinägern fått nöja sig med strukna mått.

Och allra sist måste jag naturligtvis påpeka att jag mycket väl vet att distriktet i Frankrike heter Provençale, och inget annat. Att salladen fått namnet Provinçale beror helt enkelt på att jag inte hittat denna fantastiska senap på hyllorna den senaste tiden, utan fått nöja mig med ett provisorium — därav namnet. Mina försök att ersätta »Senap Provençale» kommer förmodligen att att bli en blogga det också, om jag finner någon lämplig blandning. Tycker ni att namnen är såpass lika att de lätt kan förväxlas, föreslår jag att ni döper om rätten till »Potatissallad amatörvençale», för jag vill inte försöka lura i någon att jag är något proffs.


Fotnoter:

  1. Man var dock tvungen att handla andra varor för 200 kr; men som bekant är det vanligen inget större problem med dagens priser. []
  2. Åtminstone inte i negativ riktning. []

En ångerfull fuskare

Bo Hedlund frågade just på facebook om vi råkat ut för fusk någon gång, och det kan kanske vara dags att berätta omständigheterna kring den gången jag råkade ut för det. För att inte i onödan förstöra min motståndares rykte tänker jag dock inte nämna hans namn, eller några närmare omständigheter, mer än att detta hände i en lagmatch någon gång på åttiotalet. Den som absolut vill veta vem det var har, om jag inte minns helt fel, numera möjlighet att genom att lägga några timmars efterforskningar på nätet ta reda på det, men jag tänker inte berätta hur det går till.

Hur som helst, det var i denna relativt normala ställning som det hände saker:









bosjo – NN
Svart vid draget

Detta måste, inom parentes sagt, vara en synnerligen harmonisk ställning, för om inte min databas ljuger har herrar Schubert och Bach (visserligen med förnamnen Thomas och Matthias, men ändå) råkat få upp samma ställning ett antal år senare.

Jag har i ovanstående ställning just spelat 16.Te1, som en förberedelse för en löparreträtt på ett eventuellt springarinhopp på f4 (Schubert – Bach fortsatte mycket riktigt så), och tagit min vanliga promenad för att titta på övriga partier. Som jag säkert avslöjat någon gång var min taktik i lagmatcher som vit oftast att spela obegripliga drag som eventuellt såg ut att hota något, samtidigt som jag vandrade omkring i spellokalen med ett odrägligt belåtet leende på läpparna. Tanken var naturligtvis att motståndaren skulle spendera mycket tid på att leta efter hot som inte fanns och därefter komma i tidsnöd, och i tidsnöden hoppades jag kunna lura honom på något sätt. Det fungerade faktiskt ganska bra.

Alltnog, jag tog en tur in i det andra rummet av de två vi spelade i, och när jag kom tillbaka såg jag min motståndare flytta b-bonden två steg. Jag satte mig på min plats, och begrundade följande ställning:









bosjo – NN
Vit är konfunderad

Efter att ha dubbel- och trippelkollat mitt protokoll sa jag till min motståndare något i stil med »det är något skumt med ställningen, jag känner inte igen den». Motståndaren ryckte till, flyttade e5-hästen till f6 och sa att han råkade ställa hästen fel när han gjorde »jadoube». Jag funderade inte så mycket på det, även om jag säkert undrade hur någon kunde vara så darrhänt att hen missade rätt ruta vid en »korrigering» — jag hade sett att jag nu kunde vinna en bonde, och slog därför omedelbart en passant. Partiet slutade snabbt; 17. axb6ep Dxb6 18. Sc4 1–0.

Det var först på vägen hem som jag med hjälp av en lagkamrat räknade ut vad som hänt. Han frågade hur jag vunnit mitt parti, och om jag slog på d6; jag svarade att nej, han gav upp innan jag hann ta bonden; varpå min lagkamrat något förbryllat sa »men jag såg ju hur han spelade Sd7…» Det som hände måste alltså ha varit att min motståndare spelade Sd7, omedelbart såg att han därmed satte bort en bonde, ställde »tillbaka» hästen på e5 (inte helt obegripligt; det brukar stå hästar på e5 i Benoni, och hade ju just gjort det här också) och spelade raskt b5 med förhoppningen att ingen skulle ha sett vad som hänt. Men gissningsvis var han så skakad över det som hänt att han mentalt gav upp partiet (17…Dxb6 är knappast det bästa, och att ge upp för att man förlorar en bonde är väl lite väl tidigt, åtminstone i en lagmatch).

Jag har också varit med om ett intressant fall av icke-fusk. I Norrköpings-SM 1988 kom jag en rond några minuter för sent; jag pendlade varje dag från Linköping, och kombinationen buss-tåg-spårvagn skapade en del förseningar. När jag kom till brädet såg jag att min motståndare, lite oväntat, spelat 1.d3. Efter ett kort och ganska ointressant parti tog vi remi, och jag fick reda på anledningen till det ovanliga öppningsdraget — han hade suttit och pratat med en kamrat som satt vid brädet bredvid, och när han skulle göra sitt drag hade han råkat få tag på fel bonde — han öppnade alltid med 1.e4. Eftersom han inte kunde någon teori på 1.d4, och hans kamrat skrattande påpekade att rörd är förd, och att han nog sett att han rörde d-bonden, så spelade han 1.d3 för att försöka länka in det engelskt, som han kände till relativt väl.