Prolog
Aus ProgrammingWiki
Wiki-Quelltext dieser Seite.
<language>Prolog</language>
Welche Befehle dieser Interpreter versteht finden Sie hier: [[Prolog_Predicates|Prädikatliste]].
Alternativ können Sie den Befehl LISTPREDICATES in eine EVAL Box eintragen. Es wird eine unsortierte Liste ausgegeben.
<eval id="4b1a661b54cfb">LISTPREDICATES</eval>
<code id="4b1a661b5355a">
mann(adam).
mann(tobias).
mann(frank).
frau(eva).
frau(daniela).
frau(ulrike).
vater(adam,tobias).
vater(tobias,frank).
vater(tobias,ulrike).
mutter(eva,tobias).
mutter(daniela,frank).
mutter(daniela,ulrike).
grossvater(X,Y) :-
vater(X,Z),
vater(Z,Y).
grossvater(X,Y) :-
vater(X,Z),
mutter(Z,Y).
</code>
<eval id="4b1a661b554e5">
grossvater(X,frank).
</eval>
<code id="4b1a661b53d20">
%queens(N,[N1,N2,...,NN]) is true if you can put a queen on an NxN
% in the ith rank of the nth file, s.t. no
% queen attacks any other queen.
queens(N,Qs) :-
range(1,N,Ns), queens(Ns,[],Qs).
queens(UnplacedQs, SafeQs, Qs) :-
selectq(Q, UnplacedQs, UnplacedQs1),
\+ attack(Q,SafeQs),
queens(UnplacedQs1,[Q|SafeQs],Qs).
queens([],Qs,Qs).
attack(X,Xs) :- attack(X, 1, Xs).
attack(X,N,[Y|_]) :- X is Y+N ; X is Y-N.
attack(X,N,[_|Ys]) :- N1 is N+1, attack(X,N1,Ys).
range(M,N,[M|Ns]) :- M < N, M1 is M+1, range(M1,N,Ns).
range(N,N,[N]).
selectq(X,[X|Xs],Xs).
selectq(X,[Y|Ys],[Y|Zs]) :- selectq(X,Ys,Zs).
%Try
%queens(4,P).
%
% The result P=[3,1,4,2] means the queens go like this:
% *****************
% 4 * * * Q * *
% *****************
% 3 * Q * * * *
% *****************
% 2 * * * * Q *
% *****************
% 1 * * Q * * *
% *****************
% 1 2 3 4
</code>
<eval id="4b1a661b55cd2">
queens(8,P).
</eval>
<code id="4b1a661b544ed">
% Einstein Rätsel!
% Nur 2% der Personen auf der Welt können dieses Rätsel lösen;-)
%
% Es gibt fünf Häuser mit je einer Farbe.
% In jedem Haus wohnt eine Person einer anderen Nationalität.
% Jeder Hausbewohner bevorzugt ein bestimmtes Getränk, raucht eine bestimmte Zigarettenmarke und hält ein bestimmtes Haustier.
% KEINE der fünf Personen trinkt das gleiche Getränk, raucht die gleichen Zigaretten oder hält das gleiche Tier wie einer seiner Nachbarn.
%
% Hinweise:
% 1. Der Brite lebt im roten Haus.
% 2. Der Schwede haelt einen Hund.
% 3. Der Daene trinkt gerne Tee.
% 4. Das gruene Haus steht links vom weissen Haus.
% 5. Der Besitzer vom gruenen Haus trinkt Kaffee.
% 6. Die Person, die PallMall raucht, haelt eine Vogel.
% 7. Der Mann, der im mittleren Haus wohnt, trinkt gerne Milch.
% 8. Der Besitzer des gelben Hauses raucht Dunhill.
% 9. Der Norweger wohnt im ersten Haus.
%10. Der Malboro-Raucher wohnt neben dem, der eine Katze haelt.
%11. Der Mann, der ein Pferd haelt, wohnt neben dem, der Dunhill raucht.
%12. Der Winfield-Raucher trinkt gerne Bier.
%13. Der Norweger wohnt neben dem blauen Haus.
%14. Der Deutsche raucht Rothmanns.
%15. Der Malboro-Raucher hat einen Nachbarn, der Wasser trinkt.
% Mögliche Lösungen:
% A = 1, norweger, gruen, kaffee, pallmall, vogel
% B = 2, deutscher, blau, wasser, rothmanns, katze
% C = 3, schwede, weiss, milch, marlboro, hund
% D = 4, brite, rot, bier, winfield, pferd
% E = 5, daene, gelb, tee, dunhill, fisch ;
% A = 1, norweger, gruen, kaffee, marlboro, fisch
% B = 2, deutscher, blau, wasser, rothmanns, katze
% C = 3, schwede, gelb, milch, dunhill, hund
% D = 4, brite, rot, bier, winfield, pferd
% E = 5, daene, weiss, tee, pallmall, vogel ;
% A = 1, norweger, gruen, kaffee, pallmall, vogel
% B = 2, deutscher, blau, wasser, rothmanns, katze
% C = 3, brite, rot, milch, marlboro, pferd
% D = 4, daene, gelb, tee, dunhill, fisch
% E = 5, schwede, weiss, bier, winfield, hund ;
% A = 1, norweger, gruen, kaffee, pallmall, vogel
% B = 2, deutscher, blau, wasser, rothmanns, fisch
% C = 3, brite, rot, milch, marlboro, pferd
% D = 4, daene, gelb, tee, dunhill, katze
% E = 5, schwede, weiss, bier, winfield, hund ;
% A = 1, norweger, gruen, kaffee, pallmall, vogel
% B = 2, deutscher, blau, wasser, rothmanns, katze
% C = 3, schwede, weiss, milch, marlboro, hund
% D = 4, daene, gelb, tee, dunhill, fisch
% E = 5, brite, rot, bier, winfield, pferd ;
% A = 1, norweger, gruen, kaffee, pallmall, vogel
% B = 2, deutscher, blau, wasser, rothmanns, fisch
% C = 3, schwede, weiss, milch, marlboro, hund
% D = 4, daene, gelb, tee, dunhill, katze
% E = 5, brite, rot, bier, winfield, pferd ;
% A = 1, norweger, gelb, wasser, dunhill, katze
% B = 2, daene, blau, tee, marlboro, pferd
% C = 3, brite, rot, milch, pallmall, vogel
% D = 4, deutscher, gruen, kaffee, rothmanns, fisch
% E = 5, schwede, weiss, bier, winfield, hund ;
%mögliche Nationen
nation(brite).
nation(schwede).
nation(daene).
nation(norweger).
nation(deutscher).
%mögliche Farben
farbe(rot).
farbe(gelb).
farbe(gruen).
farbe(weiss).
farbe(blau).
%mögliche Getränke
getraenk(milch).
getraenk(wasser).
getraenk(bier).
getraenk(kaffee).
getraenk(tee).
%mögliche Zigaretten
zigaretten(dunhill).
zigaretten(winfield).
zigaretten(rothmanns).
zigaretten(marlboro).
zigaretten(pallmall).
%mögliches Haustier
haustier(hund).
haustier(vogel).
haustier(pferd).
haustier(katze).
haustier(fisch).
%Positionen
pos(1).
pos(2).
pos(3).
pos(4).
pos(5).
ungleich(A,B,C,D,E):-
not(A = B),
not(A = C),
not(A = D),
not(A = E),
not(B = C),
not(B = D),
not(B = E),
not(C = D),
not(C = E),
not(D = E).
position(A, B, C, D, E):-
pos(A),
pos(B),
pos(C),
pos(D),
pos(E),
ungleich(A, B, C, D, E).
nation(A,B,C,D,E):-
nation(A),
nation(B),
nation(C),
nation(D),
nation(E),
ungleich(A,B,C,D,E).
farbe(A,B,C,D,E):-
farbe(A),
farbe(B),
farbe(C),
farbe(D),
farbe(E),
ungleich(A,B,C,D,E).
getraenk(A, B, C, D, E):-
getraenk(A),
getraenk(B),
getraenk(C),
getraenk(D),
getraenk(E),
ungleich(A, B, C, D, E).
zigaretten(A, B, C, D, E):-
zigaretten(A),
zigaretten(B),
zigaretten(C),
zigaretten(D),
zigaretten(E),
ungleich(A, B, C, D, E).
haustier(A, B, C, D, E):-
haustier(A),
haustier(B),
haustier(C),
haustier(D),
haustier(E),
ungleich(A,B,C,D,E).
% Masterrule: Vorlage für rule
% z.B. deutscher raucht rothmanns, k=deutscher, l=rothmanns
% übergabe: paarweise nation und zigarette
mrule(A,B,C,D,E,F,G,H,I,J,K,L):-
A = K,
B = L.
mrule(A,B,C,D,E,F,G,H,I,J,K,L):-
C = K,
D = L.
mrule(A,B,C,D,E,F,G,H,I,J,K,L):-
E = K,
F = L.
mrule(A,B,C,D,E,F,G,H,I,J,K,L):-
G = K,
H = L.
mrule(A,B,C,D,E,F,G,H,I,J,K,L):-
I = K,
J = L.
siedlung((P1, N1 ,F1, G1, Z1, T1),(P2, N2, F2, G2, Z2, T2), (P3, N3, F3, G3, Z3, T3), (P4, N4, F4, G4, Z4, T4), (P5, N5, F5, G5, Z5, T5)):-
P1 = 1,
P2 = 2,
P3 = 3,
P4 = 4,
P5 = 5,
%position(P1,P2,P3,P4,P5),
nation(N1,N2,N3,N4,N5),
% Der Norweger wohnt im ersten Haus.
mrule(P1,N1,P2,N2,P3,N3,P4,N4,P5,N5,1,norweger),
farbe(F1,F2,F3,F4,F5),
rule4(F1,1,F2,2,F3,3,F4,4,F5,5),
% Der Brite lebt im roten Haus.
mrule(N1,F1,N2,F2,N3,F3,N4,F4,N5,F5, brite, rot),
getraenk(G1,G2,G3,G4,G5),
% Der Mann, der im mittleren Haus wohnt, trinkt Milch.
mrule(P1,G1,P2,G2,P3,G3,P4,G4,P5,G5,3,milch),
% Der Besitzer des grünen Hauses trinkt Kaffee
mrule(F1,G1,F2,G2,F3,G3,F4,G4,F5,G5, gruen, kaffee),
% Der Däne trinkt gerne Tee.
mrule(N1,G1,N2,G2,N3,G3,N4,G4,N5,G5, daene, tee),
zigaretten(Z1, Z2, Z3, Z4, Z5),
% Der Winfield-Raucher trinkt gerne Bier.
mrule(Z1,G1,Z2,G2,Z3,G3,Z4,G4,Z5,G5,winfield,bier),
% Der Besitzer des gelben Hauses raucht Dunhill.
mrule(F1,Z1,F2,Z2,F3,Z3,F4,Z4,F5,Z5,gelb,dunhill),
haustier(T1, T2, T3, T4, T5),
% Der Schwede hält einen Hund
mrule(N1,T1,N2,T2,N3,T3,N4,T4,N5,T5, schwede, hund),
% Die Person, die Pall Mall raucht, hält einen Vogel.
mrule(Z1,T1,Z2,T2,Z3,T3,Z4,T4,Z5,T5, pallmall, vogel),
% Der Deutsche raucht Rothmanns.
mrule(N1,Z1,N2,Z2,N3,Z3,N4,Z4,N5,Z5,deutscher,rothmanns),
% Der Marlboro-Raucher wohnt neben dem, der eine Katze hält.
nrule(Z1,T1,Z2,T2,Z3,T3,Z4,T4,Z5,T5,marlboro,katze),
% Der Mann, der ein Pferd hält, wohnt neben dem, der Dunhill raucht.
nrule(Z1,T1,Z2,T2,Z3,T3,Z4,T4,Z5,T5, dunhill, pferd),
% Der Norweger wohnt neben dem blauen Haus.
nrule(N1,F1,N2,F2,N3,F3,N4,F4,N5,F5, norweger, blau),
% Der Marlboro-Raucher hat einen Nachbarn, der Wasser trinkt.
nrule(Z1,G1,Z2,G2,Z3,G3,Z4,G4,Z5,G5, marlboro, wasser).
% Allgemeine Regel für "wohnt neben"
nrule(A,B,C,D,E,F,G,H,I,J,K,L):-
A = K,
D = L.
nrule(A,B,C,D,E,F,G,H,I,J,K,L):-
C = K,
F = L.
nrule(A,B,C,D,E,F,G,H,I,J,K,L):-
E = K,
H = L.
nrule(A,B,C,D,E,F,G,H,I,J,K,L):-
G = K,
J = L.
nrule(A,B,C,D,E,F,G,H,I,J,K,L):-
B = L,
C = K.
nrule(A,B,C,D,E,F,G,H,I,J,K,L):-
D = L,
E = K.
nrule(A,B,C,D,E,F,G,H,I,J,K,L):-
F = L,
G = K.
nrule(A,B,C,D,E,F,G,H,I,J,K,L):-
H = L,
I = K.
% Der Marlboro-Raucher wohnt neben dem, der eine Katze hält.
ruleN1(marlboro,_,_,katze,_,_,_,_,_,_).
ruleN1(_,_,marlboro,_,_,katze,_,_,_,_).
ruleN1(_,_,_,_,marlboro,_,_,katze,_,_).
ruleN1(_,_,_,_,_,_,marlboro,_,_,katze).
ruleN1(_,katze,marlboro,_,_,_,_,_,_,_).
ruleN1(_,_,_,katze,marlboro,_,_,_,_,_).
ruleN1(_,_,_,_,_,katze,marlboro,_,_,_).
ruleN1(_,_,_,_,_,_,_,katze,marlboro,_).
% Der Mann, der ein Pferd hält, wohnt neben dem, der Dunhill raucht.
ruleN2(dunhill,_,_,pferd,_,_,_,_,_,_).
ruleN2(_,_,dunhill,_,_,pferd,_,_,_,_).
ruleN2(_,_,_,_,dunhill,_,_,pferd,_,_).
ruleN2(_,_,_,_,_,_,dunhill,_,_,pferd).
ruleN2(_,pferd,dunhill,_,_,_,_,_,_,_).
ruleN2(_,_,_,pferd,dunhill,_,_,_,_,_).
ruleN2(_,_,_,_,_,pferd,dunhill,_,_,_).
ruleN2(_,_,_,_,_,_,_,pferd,dunhill,_).
% Der Norweger wohnt neben dem blauen Haus.
ruleN3(norweger,_,_,blau,_,_,_,_,_,_).
ruleN3(_,_,norweger,_,_,blau,_,_,_,_).
ruleN3(_,_,_,_,norweger,_,_,blau,_,_).
ruleN3(_,_,_,_,_,_,norweger,_,_,blau).
ruleN3(_,blau,norweger,_,_,_,_,_,_,_).
ruleN3(_,_,_,blau,norweger,_,_,_,_,_).
ruleN3(_,_,_,_,_,blau,norweger,_,_,_).
ruleN3(_,_,_,_,_,_,_,blau,norweger,_).
% Der Marlboro-Raucher hat einen Nachbarn, der Wasser trinkt.
ruleN4(marlboro,_,_,wasser,_,_,_,_,_,_).
ruleN4(_,_,marlboro,_,_,wasser,_,_,_,_).
ruleN4(_,_,_,_,marlboro,_,_,wasser,_,_).
ruleN4(_,_,_,_,_,_,marlboro,_,_,wasser).
ruleN4(_,wasser,marlboro,_,_,_,_,_,_,_).
ruleN4(_,_,_,wasser,marlboro,_,_,_,_,_).
ruleN4(_,_,_,_,_,wasser,marlboro,_,_,_).
ruleN4(_,_,_,_,_,_,_,wasser,marlboro,_).
% Der Brite lebt im roten Haus.
rule1(brite, rot,_,_,_,_,_,_,_,_).
rule1(_,_,brite,rot,_,_,_,_,_,_).
rule1(_,_,_,_,brite,rot,_,_,_,_).
rule1(_,_,_,_,_,_,brite,rot,_,_).
rule1(_,_,_,_,_,_,_,_,brite,rot).
% Der Schwede hält einen Hund
rule2(N1,F1,N2,F2,N3,F3,N4,F4,N5,F5):-
N1 = schwede,
F1 = hund.
rule2(N1,F1,N2,F2,N3,F3,N4,F4,N5,F5):-
N2 = schwede,
F2 = hund.
rule2(N1,F1,N2,F2,N3,F3,N4,F4,N5,F5):-
N3 = schwede,
F3 = hund.
rule2(N1,F1,N2,F2,N3,F3,N4,F4,N5,F5):-
N4 = schwede,
F4 = hund.
rule2(N1,F1,N2,F2,N3,F3,N4,F4,N5,F5):-
N5 = schwede,
F5 = hund.
% Der Däne trinkt gerne Tee.
rule3(daene,tee,_,_,_,_,_,_,_,_).
rule3(_,_,daene,tee,_,_,_,_,_,_).
rule3(_,_,_,_,daene,tee,_,_,_,_).
rule3(_,_,_,_,_,_,daene,tee,_,_).
rule3(_,_,_,_,_,_,_,_,daene,tee).
haus(P, daene, F, tee, Z, T).
% Das grüne Haus steht links vom weißen Haus
rule4(gruen,1,weiss,2,_,_,_,_,_,_).
rule4(gruen,1,_,_,weiss,3,_,_,_,_).
rule4(gruen,1,_,_,_,_,weiss,4,_,_).
rule4(gruen,1,_,_,_,_,_,_,weiss,5).
rule4(_,_,gruen,2,weiss,3,_,_,_,_).
rule4(_,_,gruen,2,_,_,weiss,4,_,_).
rule4(_,_,_,_,gruen,3,weiss,4,_,_).
rule4(gruen,1,_,_,_,_,_,_,weiss,5).
rule4(_,_,gruen,2,_,_,_,_,weiss,5).
rule4(_,_,_,_,gruen,3,_,_,weiss,5).
rule4(_,_,_,_,_,_,gruen,4,weiss,5).
% Der Besitzer des grünen Hauses trinkt Kaffee
rule5(gruen,kaffee,_,_,_,_,_,_,_,_).
rule5(_,_,gruen,kaffee,_,_,_,_,_,_).
rule5(_,_,_,_,gruen,kaffee,_,_,_,_).
rule5(_,_,_,_,_,_,gruen,kaffee,_,_).
rule5(_,_,_,_,_,_,_,_,gruen,kaffee).
% Die Person, die Pall Mall raucht, hält einen Vogel.
rule6(pallmall,vogel,_,_,_,_,_,_,_,_).
rule6(_,_,pallmall,vogel,_,_,_,_,_,_).
rule6(_,_,_,_,pallmall,vogel,_,_,_,_).
rule6(_,_,_,_,_,_,pallmall,vogel,_,_).
rule6(_,_,_,_,_,_,_,_,pallmall,vogel).
</code>
<eval id="4b1a661b564a4">siedlung(A,B,C,D,E).</eval>