www.mamboteam.com
aptitude : me and my debian - a work in progress  
Startsida arrow debian arrow Vem äger zebran?
2008-05-13
 
 
Huvudmeny
Startsida
debian
bash
Forum
Användarmeny
tidigare material
nyheter
grafik
Artikeltips
BadVista
Vem äger zebran?  E-post

Image 1. Fem villor ligger i rad, alla har olika färg och de bebos av män av skilda nationaliteter och med olika smak i frågan om drycker, frukt och husdjur.
2. Engelsmannen bor i den röda villan.
3. Spanjoren äger hunden.
4. Kaffe dricks i den gröna villan.
5. Ukrainaren dricker te.
6. Den gröna villan ligger närmast till höger om den vita villan.
7. Äppelätaren håller sniglar.
8. Plommon äts i den gula villan.
9. Mjölk dricks i den mellersta villan.
10. Norrmannen bor i den yttersta villan åt vänster.
11. Mannen som äter päron bor i villan närmast rävägarens.
12. Plommon äts i villan närmast hästägaren
13. Hallonätaren dricker apelsinjuice.
14. Japanen äter apelsin.
15. Norrmannen är närmaste granne med mannen i den blå villan.

Alltså: vem dricker vatten? Vem äger zebran?

Jag håller på att försöka komma underfund med prolog. Det är ett språk för logikprogrammering som används inom artificiell intelligens och språkbehandling. Installera prolog med sudo apt-get install gprolog

Men först lite tester. Jag skapar filen 'test.pl' :

gillar(eva, mat).
gillar(eva, vin).
gillar(adam, vin).

Här har jag definierat att eva gillar mat och vin. Adam gillar bara vin. Nu startar jag prolog.

$ prolog
[test].
| ?- gillar(adam, vin).
true
 
| ?- gillar(adam, bananer).
no

Det står alltså bortom allt rimligt tvivel att Adam inte är så förtjust i bananer medan han däremot gärna tar ett glas vin eller två.

% ananas och apelsin är frukt
frukt(ananas).
frukt(apelsin).
 
% saker eva gillar
gillar(eva, mat).
gillar(eva, vin).
% eva gillar saker som är frukt
gillar(eva, X):-frukt(X).
 
% eva gillar alla som gillar vin
gillar(eva, P):-gillar(P, vin).
 
% saker ernie gillar
gillar(ernie, vin).
 
% saker adam gillar
gillar(adam, vin).
gillar(adam, eva).
 
% adam gillar allt eva gillar
gillar(adam, X):-gillar(eva, X).

Enligt ovanstående logik borde adam gilla ernie (eftersom adam gillar allt som eva gillar OCH eva gillar alla som gillar vin OCH ernie gillar vin).
Jag frågar...

 
| ?- gillar(adam, ernie).
yes

Med kommandot 'trace.' kan jag följa hur prolog gör sin slutledning.

| ?- trace.
The debugger will first creep -- showing everything (trace)
 
yes
{trace}
| ?- gillar(adam, ernie).
      1    1  Call: gillar(adam,ernie) ? (vet inte)
      2    2  Call: gillar(eva,ernie) ? (vet inte)
      3    3  Call: frukt(ernie) ? (är ernie en frukt?)
      3    3  Fail: frukt(ernie) ? (nej!)
      3    3  Call: gillar(ernie,vin) ? 
      3    3  Exit: gillar(ernie,vin) ? (ja! ernie gillar vin)
      2    2  Exit: gillar(eva,ernie) ? (eva gillar ernie)
      1    1  Exit: gillar(adam,ernie) ? (adam gillar ernie)
 
yes

I nästa del av den här artikeln tar jag tag i problemet med zebran.

Läs mer om prolog
 

prologkod för lösning av problemet

 
zebra(ZebraLand, WaterLand) :-
  Land = [Engelsman, Spanjor, Japan,  Ukrainare, Norrman],
  Husfarg = [Rod, Gron, Vit, Gul, Bla],
  Frukt = [Apple, Plommon, Paron, Hallon, Apelsin],
  Djur = [Hund, Snigel, Rav, Hast, Zebra],
  Dryck = [Te, Kaffe, Mjolk, Apelsinjuice, Vatten],
 
  fd_domain(Land,1,5),
  fd_domain(Husfarg,1,5),
  fd_domain(Frukt,1,5),
  fd_domain(Djur,1,5),
  fd_domain(Dryck,1,5),
 
  fd_all_different(Land),
  fd_all_different(Husfarg),
  fd_all_different(Frukt),
  fd_all_different(Djur),
  fd_all_different(Dryck),
 
  Engelsman = Rod,
  Spanjor = Hund,
  Gron = Kaffe,
  Ukrainare = Te,
  Gron #= Vit + 1,
  Apple = Snigel,
  Gul = Plommon,
  Mjolk = 3,
  Norrman = 1,
  dist(Paron,Rav) #=1,
  dist(Plommon,Hast) #= 1,
  Hallon = Apelsinjuice,
  Japan = Apelsin,
  dist(Norrman,Bla) #=1,
 
 
  
  append(Land, Husfarg, L1),
  append(L1, Frukt, L2),
  append(L2, Djur, L3),
  append(L3, Dryck, List), 
  fd_labeling(List),
  
  NatNames = [Engelsman-engelsman, Spanjor-spanjor, Japan-japan,
        Ukrainare-ukrainare, Norrman-norrman],
  memberchk(Zebra-ZebraLand, NatNames),
  memberchk(Vatten-WaterLand, NatNames).
  
run :-
        zebra(ZebraLand, WaterLand),
  write(ZebraLand),write(' äger zebran'),nl,
  write(WaterLand),write(' dricker vatten'),nl.
 
:- initialization(run).
Kommentarer (2)Add Comment
Underbart exempel!
skriven av David Holm, maj 26, 2007
Underbart exempel på hur man kan använda prolog! Jag önskar att vi fått en lika pedagogisk introduktion i skolan. Där kastade man in oss i prolog med en snabbgenomgång på 2h. De flesta hade ingen aning om vad de skulle göra och Prolog fick snabbt stämpeln som ondskans språk. Sanningen är ju att logikprogrammering är ett smidigt verktyg när man jobbar med den sortens problem.
Trevligt att fler ser att prolog är vackert
skriven av A Jackson, november 26, 2007
Fast i andra exemplet anväder du constraint-programmering i prolog. Det är snyggt, men inte ren prolog smilies/smiley.gif

Enklart problem är att skriva merge-sort i prolog. Det är jättesnyggt deklarativt. Quick-sort är däremot inte lika snyggt.

Ta även och titta på n-queensproblemet. Det är jättesnyggt i prolog.

Skriv kommentar

busy
 
< Föregående   Nästa >
 
Top! Top!