Logikbasierte Programmierung

Aus ProgrammingWiki

Wiki-Quelltext dieser Seite.

<language>Prolog</language>
[[Programmierparadigmen_-_Computerübungen|Zur Übungsübersicht]]

Die folgenden Aufgaben beziehen sich direkt auf die in der Vorlesung verwendete Linienfhrung und die vorgestellten Beispiele. Es empfiehlt sich also das Sktipt durchzuarbeiten, die Beispiele dazu sind jedoch in Prolog geschrieben.

==Begriffe==
Wiederholen Sie die Begriffe Relation und Prädikat aus der Mathematik.

==Personen==
===Mann===
Hier ein Beispiel für Prolog, es beschreibt die Mann Relation aus der Vorlesung,
die Syntax für eine Relation ist <tt> <relation>(<wert>[,<werte>]).</tt>
<code>
mann(adam).
mann(tobias).
mann(frank).
</code>

Mit der Syntax <tt><realtion>(<wert>).</tt> kann man abfragen ob ein Wert zu dieser Relation gehört.

'''Hinweis in Prolog wird <tt>?-</tt> Voran gestellt was hier aber durch die Ausführungsbox Automatisch geschieht

<eval>mann(tobias).</eval>
<eval>mann(heinrich).</eval>

===Frau===
Definieren Sie eine einstellige Relation frau nach dem Vorbild von mann mit
den Elementen eva, daniela und ulrike.
<code>%frau</code>
<eval>frau(daniela).</eval>

===Mutter===
<code>
mutter(eva,tobias).
mutter(daniela,frank).
mutter(daniela,ulrike).
</code>
<eval>mutter(eva,tobias).</eval>
<eval>mutter(ulrike,tobias).</eval>

===Vater===
Definieren Sie eine zweistellige Relation vater nach dem Vorbild von mutter.
Beziehungen
{|
!Vater!Sohn
|-
|adam|tobias
|-
|tobias|frank
|-
|tobias,ulrike
|}
<code>%Vater</code>
<eval>vater(tobias,frank).</eval>

===Großvater=== 
Fragen Sie nach dem Namen des Großvaters von Frank. Gibt es weitere
Großväter, die sich aus unserer Wissensbasis ermitteln lassen?

'''Hinweis:''' Sie müssen dazu eine Regel erstellen die angiebt welche Regeln es zu befolgen gibt um den Großvater zu ereichen, in Prolog können sie auch mit einen Namen mehre regeln Verbinden.
 
'''Syntax '''

 regelname(<variable>,[variablen]) :- 
 :relation(<variable>,[variablen])
 :[,relationen(<variable>,[variablen])].

<code>%Großvater</code>
<eval>grossvater(X,frank).</eval>

==Zusatz==

===Einsteins Rätsel=== 

Dies ist eine Version des Zebrarätsels. Es wurde angeblich von Einstein im 19. Jahrhundert verfasst. Einstein wird oft der Vermerk zugeschrieben, nur 2 % der Weltbevölkerung seien im Stande, das Rätsel zu lösen. Es existiert jedoch kein Hinweis auf jedwede Autorenschaft. Hier soll es ein Beispiel für ein Problem darstellen, das mit Prolog lösbar ist.

<popup name="Aufgabe mit Lösung">

;Bedingungen
:Es gibt fünf Häuser mit je einer anderen Farbe.
:In jedem Haus wohnt eine Person anderer 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 seine Nachbarn.

Frage: Wem gehört der Fisch?

;Hinweise:
:Der Brite lebt im roten Haus.
:Der Schwede hält einen Hund.
:Der Däne trinkt gern Tee.
:Das grüne Haus steht direkt links neben dem weißen Haus.
:Der Besitzer des grünen Hauses trinkt Kaffee.
:Die Person, die Pall Mall raucht, hält einen Vogel.
:Der Mann, der im mittleren Haus wohnt, trinkt Milch.
:Der Besitzer des gelben Hauses raucht Dunhill.
:Der Norweger wohnt im ersten Haus.
:Der Marlboro-Raucher wohnt neben dem, der eine Katze hält.
:Der Mann, der ein Pferd hält, wohnt neben dem, der Dunhill raucht.
:Der Winfield-Raucher trinkt gern Bier.
:Der Norweger wohnt neben dem blauen Haus.
:Der Deutsche raucht Rothmans.
:Der Marlboro-Raucher hat einen Nachbarn, der Wasser trinkt.

<code>
% Einstein Rätsel!

%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>siedlung(A,B,C,D,E).</eval>
</popup>

[[Programmierparadigmen_-_Computerübungen|Zur Übungsübersicht]]