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 Run Box eintragen. Es wird eine unsortierte Liste ausgegeben. 
<run id="4d2b638530833">LISTPREDICATES</run>

<code id="4d2b638530651">
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>
<run id="4d2b6385308cd">
grossvater(X,frank).
</run>


<code id="4d2b6385306d9">
%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>
<run id="4d2b638530956">
queens(8,P).
</run>

<code id="4d2b638530772">
% 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>
<run id="4d2b6385309de">siedlung(A,B,C,D,E).</run>