Humboldt-Universität zu Berlin - Mathematisch-Naturwissenschaftliche Fakultät - Logik in der Informatik

Logik-Programmierung und Prolog für IMP-Wechselnde


Im IMP-Studiengang eingeschriebene Studierende, die das Modul „I/LOG Einführung in die formale Logik für IMP“ (5LP) bereits erfolgreich abgeschlossen haben und in die neue SPO wechseln wollen, können durch die erfolgreiche Teilnahme an dieser Veranstaltung die Äquivalenz zum neuen Modul „I/A3 Logik in der Informatik“ (8LP) erwerben. Unter der Voraussetzung, dass die in „Übung Logikprogrammierung und Prolog für IMP-Wechselnde“ vorgesehene Studienleistung (Übungsschein) erbracht wird, wird die im Modul „I/LOG Einführung in die formale Logik für IMP“ erzielte Note als äquivalent zum Modul „I/A3 Logik in der Informatik“ anerkannt.


 


Aktuelles

  • Beachten Sie: Für die Nutzung der Rechner der RBG in der Übung, wie auch für den Zugang des Referenzrechners, ist zwingend (seit diesem Semester) ein Informatik-Account notwendig (hier rechtzeitig beantragen). Ein Zugang mittels CMS-Account ist nicht mehr möglich.

  • Die Veranstaltung findet erstmalig in der zweiten Woche der Vorlesungszeit statt, also am 22.10.25. Um erfolgreich an der Veranstaltung teilnehmen zu können, müssen Sie sich
    1. in AGNES anmelden (Ende der Nachfrist: 16.10.25).
    2. im Moodle-Kurs anmelden. Der Einschreibeschlüssel wird an die über AGNES eingeschriebenen Studierenden verschickt (bis 14.10.25) und kann von den Teilnehmer*innen, die noch nicht über AGNES eingeschrieben sind, danach auch per Email an mich erfragt werden.
 

Übungsbetrieb und erfolgreicher Abschluss

Zeit und Raum der Veranstaltung: Mittwochs 9-11 Uhr, RUD25 3.213

Übungsaufgaben

Es wird an dieser Stelle wöchentlich freitags ein Übungsblatt bereitgestellt. Die Lösung muss über Moodle abgegeben werden.

  • Blatt 1 (bereitgestellt am 17.10., Bearbeitung bis zum 27.10., 13:00 Uhr)
  • Blatt 2 (bereitgestellt am 24.10., Bearbeitung bis zum 3.11., 13:00 Uhr)
  • Blatt 3 (bereitgestellt am 31.10., Bearbeitung bis zum 10.11., 13:00 Uhr)
  • Blatt 4 (bereitgestellt am 07.11., Bearbeitung bis zum 17.11., 13:00 Uhr)
  • Blatt 5 (bereitgestellt am 14.11., Bearbeitung bis zum 24.11., 13:00 Uhr)
  • Blatt 6 (bereitgestellt am 21.11., Bearbeitung bis zum 1.12., 13:00 Uhr)
  • Blatt 7 (bereitgestellt am 28.11., Bearbeitung bis zum 8.12., 13:00 Uhr)
  • Blatt 8 (bereitgestellt am 5.12., Bearbeitung bis zum 15.12., 13:00 Uhr)
  • Blatt 9 (bereitgestellt am 12.12., Bearbeitung bis zum 5.1., 13:00 Uhr)
  • Blatt 10 (bereitgestellt am 2.01., Bearbeitung bis zum 12.1., 13:00 Uhr)
  • Blatt 11 (bereitgestellt am 9.01., Bearbeitung bis zum 19.1., 13:00 Uhr)
  • Blatt 12 (bereitgestellt am 16.01., Bearbeitung bis zum 26.1., 13:00 Uhr)

Geben Sie auf jeder Abgabe bitte Ihren Namen und Ihre Matrikelnummer an.
Eine verspätete Abgabe ist nicht möglich. Bei Problemen wenden Sie sich bitte direkt an mich (z.B. über das Diskussionsforum in Moodle).

Es ist ratsam über die Aufgaben mit Kommiliton*innen gemeinsam zu reden und nachzudenken. Aber zur Abgabe der Lösungen muss jede*r Student*in seine*ihre Lösung selbst zu erstellen und abgeben.

Für den erfolgreichen Abschluss der Veranstaltung müssen insgesamt mindestens 40% der maximal erreichbaren Punkte erreicht werden.

Abgabehinweise für die Abgabe der Programmieraufgaben über moodle (ab Übungsblatt 3)

Die Abgabe der Datei mit dem Prolog-Quellcode muss den Namen blattx.pl tragen, wobei x durch die aktuelle Blattnummer ersetzt wird. So sollte die Datei für die Abgabe von Blatt 3 den Namen blatt3.pl tragen.

In jeder Abgabe soll das Prädikat matnr/1 exakt für Ihre Matrikelnummer gelten. Wenn Sie also die Matrikelnummer 123456 haben, soll Prolog auf die Anfrage ?- matnr(X). mit X = 123456. antworten. Wird die Datei über einen moodle-Account abgegeben, werden frühere Abgaben für diese Aufgabe überschrieben.

Beachten Sie, dass wir Ihre Bearbeitung dieser Aufgaben nur dann bewerten, wenn sich der abgegebene Prolog-Quellcode von SWI-Prolog auf gruenau6 ohne Fehlermeldungen laden lässt und die Abarbeitung gegebener Beispielanfragen nicht länger als 10 Sekunden dauert!

Korrekturanmerkungen zu Ihren Prolog-Abgaben können in Moodle unter Bewertungen (in der Navigationsleiste) eingesehen werden.

Eine Kurzanleitung für den Fernzugriff auf gruenau6 findet sich hier.

Downloads

Hier finden Sie zu gegebener Zeit die für die Lösung einzelner Aufgaben hilfreiche bzw. benötigten Dateien:

  • Die in Aufgabenblatt 1 & 2 beschriebene Wissensbasis ring.pl
  • Die in Aufgabenblatt 7 (und folgende) benötigte Datei al.pl
  • Die für Aufgabenblatt 9 benötigte Datei kinodb.pl
  • Die für Aufgabenblatt 10 benötigte Dateien al_def.pl, al_literals.pl und al_nf.pl
  • Die für Aufgabenblatt 11 benötigte Dateien pure_literal und unit_propagation.
  • Die für Aufgabenblatt 12 benötigte Dateien tseitin und dpll.

    Weiterhin finden Sie nachfolgend Probleminstanzen für SAT-Solver im DIMACS-Format. Wer mehr zu den Beispielen 2--x wissen möchte, kann sich unter http://massimolauria.net/cnfgen/ über die Herkunft der Formeln informieren. Ich habe einige Instanzen mal auf gruenau6 mit unserer Implementation laufen lassen und man kann sehr gut ablesen, wie sich unser Solver so mit steigendem n klarkommt... (Speichern durch Anklicken des Dateinamens)
  Name der Datei benötigte Zeit in Sekunden Anzahl der Ableitungen
Beispiel 2.64 der VL VLBeispiel264.cnf 0.002 seconds 2,814 inferences
Pebbling formula of:
Pyramid of height n
pyramid10.cnf 0.008 seconds 28,386 inferences
  pyramid15.cnf 0.029 seconds 110,095 inferences
  pyramid50.cnf 1.631 seconds 9,668,024 inferences
Pigeonhole principle formula
for n+1 pigeons and n holes
php4_3.cnf 0.003 seconds 10,439 inferences
  php5_4.cnf 0.010 seconds 64,762 inferences
  php6_5.cnf 0.085 seconds 406,535 inferences
  php7_6.cnf 0.489 seconds 2,691,573 inferences
  php8_7.cnf 2.878 seconds 19,514,171 inferences
  php9_8.cnf 22.321 seconds 157,722,886 inferences
  php10_9.cnf 166.006 seconds 1,423,024,293 inferences
  php11_10.cnf 2124.783 seconds 14,237,397,770 inferences
  php12_11.cnf 22926.179 seconds ~6h22 156,624,865,223 inferences
  php13_12.cnf 275571.056 seconds ~3T4h33 1,879,522,854,956 inferences
  php14_13.cnf ... ..
  php15_14.cnf ... ..
 

Beispiele aus der Übung

 


Woche 01

 
01-01.pl
joker_verdaechtig :-geld_verbrannt,lachgas.
geld_verbrannt.
lachgas.
 
01-02.pl
woman(mia).
woman(jody).
woman(yolanda).
loves(vincent, mia).
loves(marsellus, mia).
playsAirGuitar(jody).
party.
 
01-03.pl
loves(ramona,roxy).
loves(ramona,todd).
time_flies(_).
ramonasEvilExes(lucas).
ramonasEvilExes(X) :- time_flies(X), loves(ramona,X).
fights(knives,X):-loves(X,scott).
fights(scott,X):- ramonasEvilExes(X).
 
01-04.pl
loves(ramona,scott).
loves(ramona,roxy).
loves(ramona,todd).
time_flies(_).
ramonasEvilExes(lucas).
ramonasEvilExes(X) :- time_flies(X), loves(ramona,X).
fights(knives,X):-loves(X,scott).
fights(scott,X):- ramonasEvilExes(X).
 

Woche 02

 
02-01.pl
good_dancer(vincent).
loves(mia,X) :- good_dancer(X).
kills(marsellus,X) :- loves(mia,X).
 
02-02.pl
f(a).
f(b).
g(a).
g(b).
h(b).
k(X) :- f(X), g(X), h(X).

 

Programmieren mit Unifikation:

Aufgabe 2.4 aus [BBS]

Die Worte werden dabei wie folgt in der Wissensbasis repräsentiert:

 
words.pl
word(astante, a,s,t,a,n,t,e).
word(astoria, a,s,t,o,r,i,a).
word(baratto, b,a,r,a,t,t,o).
word(cobalto, c,o,b,a,l,t,o).
word(pistola, p,i,s,t,o,l,a).
word(statale, s,t,a,t,a,l,e).
 
Programmieren mit Nicht-Unifizierbarkeit:
Aufgabe von Lucas Heimberg

Woche 03

 
03-01a.pl
kind(anne, brigitte).
kind(brigitte, carolin).
kind(carolin, donna).
kind(donna, emilie).

nachkomme(X, Y) :- kind(X, Y).
nachkomme(X, Y) :- kind(X, Z), nachkomme(Z, Y).
 
03-01b.pl
kind(anne, brigitte).
kind(brigitte, carolin).
kind(carolin, donna).
kind(donna, emilie).

nachkomme(X, Y) :- kind(X, Z), nachkomme(Z, Y).
nachkomme(X, Y) :- kind(X, Y).
 
03-01c.pl
kind(anne, brigitte).
kind(brigitte, carolin).
kind(carolin, donna).
kind(donna, emilie).

nachkomme(X, Y) :- nachkomme(Z, Y), kind(X, Z).
nachkomme(X, Y) :- kind(X, Y).
 
03-01d.pl
kind(anne, brigitte).
kind(brigitte, carolin).
kind(carolin, donna).
kind(donna, emilie).

nachkomme(X, Y) :- kind(X, Y).
nachkomme(X, Y) :- nachkomme(Z, Y), kind(X, Z).
 
03-02.pl
numeral(0).
numeral(succ(X)) :- numeral(X).
 
add.pl
double(0, 0).
double(succ(X),succ(succ(Y))) :- double(X,Y).

add(0,Y,Y).
add(succ(X),Y,succ(Z)):- add(X,Y,Z).

greater(succ(_),0).
greater(succ(X),succ(Y)):-greater(X,Y).
 

offen:

 
 

Woche 04

 
04-01.pl
element(X,[X|_]).
element(X,[_|T]) :- element(X,T).
 
04-02.pl
invert([],[]) .
invert([a|T1],[b|T2]) :- invert(T1,T2).
invert([b|T1],[a|T2]) :- invert(T1,T2).

evenElements([], []).
evenElements([_, X|T1], [X|T2]) :- evenElements(T1,T2).
 

Woche 05

 
05-01.pl
distance(point(X1, Y1), point(X2, Y2), D) :- D is sqrt((X2 - X1)**2 + (Y2 - Y1)**2).
 
05-02.pl
laenge([] , 0) .
laenge([_|T],L) :- laenge(T,LT),L is LT + 1.
 
05-03.pl
laenge([],A,A).
laenge([_|T],A,N) :- AT is A + 1 , laenge(T,AT,N).
laenge(L, N) :- laenge(L,0,N).
 
05-04.pl
prod(L, P) :- prod(L, 1, P).
prod([], A, A).
prod([H|T], A, P) :- A2 is A * H, prod(T, A2, P).
 
05-05.pl
max([], A, A).
max([H|T], A, MT) :- H > A, max(T, H, MT).
max([H|T], A, MT) :- H =< A, max(T, A, MT).
max([H|T], M) :- max(T, H, M).
 
raetsel.pl
% FAKE
% CAKE
% STORY
ziffer(0).
ziffer(1).
ziffer(2). ziffer(3). ziffer(4). ziffer(5).
ziffer(6). ziffer(7). ziffer(8). ziffer(9).

raetsel(F, A, K, E, C , S, T, O, R,Y) :-
ziffer(F), ziffer(A), ziffer(K), ziffer(E),ziffer(C),
ziffer(S), ziffer(T), ziffer(O), ziffer(R), ziffer(Y),
F =\= A, F =\= K , F =\= E, F =\= C, F =\= S, F =\= T, F =\= O, F =\= R, F =\= Y,
A =\= K , A =\=E, A =\=C, A =\=S, A =\=T, A =\=O, A =\=R, A =\=Y,
K =\=E, K =\=C, K =\=S, K =\=T, K =\=O, K =\=R, K =\=Y,
E =\=C, E =\=S, E =\=T, E =\=O, E =\=R, E =\=Y,
C =\=S, C =\=T, C =\=O, C =\=R, C =\=Y,
S =\=T, S =\=O, S =\=R, S =\=Y,
T =\=O, T =\=R, T =\=Y,
O =\=R, O =\=Y,
R =\=Y,
S =\= 0, C =\= 0, F =\= 0,
Y =:= (E + E) mod 10, U1 is (E + E) // 10,
R =:= (K + K + U1) mod 10, U2 is (K + K + U1) // 10,
O =:= (A + A + U2) mod 10, U3 is (A + A + U2) // 10,
T =:= (F + C + U3) mod 10, S =:= (F + C + U3) // 10.

% Try:
% ?- time(findall([F, A, K, E, C , S, T, O, R,Y],raetsel(F, A, K, E, C , S, T, O, R,Y),Z)).
 
raetselOpt.pl
% FAKE
% CAKE
% STORY
ziffer(0).
ziffer(1).
ziffer(2). ziffer(3). ziffer(4). ziffer(5).
ziffer(6). ziffer(7). ziffer(8). ziffer(9).

raetsel(F, A, K, E, C , S, T, O, R,Y) :-
ziffer(E),
Y is (E + E) mod 10, U1 is (E + E) // 10,
ziffer(K),
R is (K + K + U1) mod 10, U2 is (K + K + U1) // 10,
ziffer(A),
O is (A + A + U2) mod 10, U3 is (A + A + U2) // 10,
ziffer(F), ziffer(C),
T is (F + C + U3) mod 10, S is (F + C + U3) // 10,
F =\= A, F =\= K , F =\=E, F =\=C, F =\=S, F =\=T, F =\=O, F =\=R, F =\=Y,
A =\= K , A =\=E, A =\=C, A =\=S, A =\=T, A =\=O, A =\=R, A =\=Y,
K =\=E, K =\=C, K =\=S, K =\=T, K =\=O, K =\=R, K =\=Y,
E =\=C, E =\=S, E =\=T, E =\=O, E =\=R, E =\=Y,
C =\=S, C =\=T, C =\=O, C =\=R, C =\=Y,
S =\=T, S =\=O, S =\=R, S =\=Y,
T =\=O, T =\=R, T =\=Y,
O =\=R, O =\=Y,
R =\=Y,
S =\= 0, C =\= 0, F =\= 0.

% Try:
% ?- time(findall([F, A, K, E, C , S, T, O, R,Y],raetsel(F, A, K, E, C , S, T, O, R,Y),Z)).
 

Offen: Der Klassiker der Rekursion

Die Fakultät n! einer natürlichen Zahl n ist definiert durch:

Definieren Sie

  • ein Prädikat fak/2, dass bei Anfrage fak(X,Y) die Fakultät von X mit Y unifiziert.
  • ein Prädikat fakAcc/2, dass äquivalent zu fak/2 ist und "End-Rekursiv” realisiert.
 

Woche 06

 
06-01.pl
% verkettet
verkettet([], Y, Y).
verkettet([H|T], Y, [H|T2]) :- verkettet(T, Y, T2).

% praefix
praefix(X, Y) :- verkettet(X, _, Y).

% suffix
suffix(X, Y) :- verkettet(_, X, Y).
 
06-02.pl
% ohne Akkumulator
umgedreht([], []).
umgedreht([H|T], R) :-
umgedreht(T, RT), verkettet(RT, [H], R).

% mit Akkumulator
umgedrehtAcc([], A, A).
umgedrehtAcc([H|T], A, R) :-
umgedrehtAcc(T, [H|A], R).
umgedrehtAcc(L, R) :- umgedrehtAcc(L, [], R).

% verkettet
verkettet([], Y, Y).
verkettet([H|T], Y, [H|T2]) :- verkettet(T, Y, T2).
 
06-03.pl
not_member(_, []).
not_member(X, [H|T]) :- X \= H, not_member(X, T).
 
06-04.pl
atree(leaf(_)).
atree(tree(L, R)) :- atree(L), atree(R).
 
sumLabels.pl
sum_labels(leaf(N), N).
sum_labels(tree(L, R), N) :-
sum_labels(L, NL), sum_labels(R, NR),
N is NL + NR.
 

Offen:

Definieren Sie ein Prädikat lookup/3, so dass lookup(X, L, Y) genau dann erfüllt ist, wenn L eine Liste von 2-Tupeln (A, B) ist, die insbesondere das Tupel (X, Y) enthält.

Beispielsweise sollte es folgene Ausgaben liefert:

?- lookup(b, [(a, 1), (b, 2), (c, 3)], X).
X = 2 ;
false.

?- lookup(b, [(a, X), (b, Y), (c, Z)], 3).
Y = 3 ;
false.

 
06-06.pl
node(a). node(b). node(c). node(d). node(e).
node(f). node(g). node(h). node(i). node(j).

edge(a, j).
edge(c, e).
edge(d, e).
edge(e, f).
edge(f, g).
edge(g, h). edge(g, j).
edge(h, g). edge(h, i).
edge(i, a). edge(i, b). edge(i, j).
edge(j, b). edge(j, c). edge(j, d). edge(j, f).

erreichbar(X, X).
erreichbar(X, Y) :-
edge(X, Z), erreichbar(Z, Y).

% Try: ?- erreichbar(a, g).
% Try: ?- erreichbar(h, a).
 
06-06a.pl
node(a). node(b). node(c). node(d). node(e).
node(f). node(g). node(h). node(i). node(j).

edge(a, j).
edge(c, e).
edge(d, e).
edge(e, f).
edge(f, g).
edge(g, h). edge(g, j).
edge(h, g). edge(h, i).
edge(i, a). edge(i, b). edge(i, j).
edge(j, b). edge(j, c). edge(j, d). edge(j, f).

erreichbarMem(X, Y) :- erreichbar(X, Y, [X]).
erreichbar(X, X, _) .
erreichbar(X, Y, Pfad) :-
edge(X, Z), not_member(Z, Pfad),
erreichbar(Z, Y, [Z|Pfad]).

% Try: ?- erreichbarMem(a, g).
% Try: ?- erreichbarMem(h, a).

% not_member

not_member(_, []).
not_member(X, [H|T]) :- X \= H, not_member(X, T).
 

Woche 07

 
07-01.pl
distribute(A * (B + C), A*B + A*C).
distribute((A + B)*C, A*C + B*C).
 
07-02.pl
numbers(X, [X]) :- number(X).
numbers(L + R, X) :-
numbers(L, XL), numbers(R, XR),
append(XL, XR, X).
numbers(L * R, X) :-
numbers(L, XL), numbers(R, XR),
append(XL, XR, X).
 
07-03.pl
complexterm(X) :- nonvar(X), X=..[_, _|_].
 
07-04.pl
sym(N, A) :-
atom_codes(N, SN),
atom_codes("x", XN),
append(XN, SN, S),
atom_codes(A, S).
 

Woche 08

 
08-01.pl
s(X, Y) :- q(X, Y).
s(0, 0).
q(X, Y) :- i(X), i(Y).
q(3, 3).
i(1).
i(2).
 
08-02.pl
s(X, Y) :- q(X, Y).
s(0, 0).
q(X, Y) :- i(X), !, i(Y).
q(3, 3).
i(1).
i(2).
 
08-03.pl
max(X, Y, Y) :- X =< Y.
max(X, Y, X) :- X > Y.
 
08-04.pl
max(X, Y, Y) :- X =< Y, !.
max(X, Y, X) :- X > Y.
 
08-05.pl
max(X, Y, Y) :- X =< Y, !.
max(X, _, X).

% Try
%
% ?-max(2,3,X).
%
% ?- max(3,2,X).
%
% ?- max(2,3,2).
 
08-06.pl
max(X, Y, Z) :- X =< Y, !, Y = Z.
max(X, _, X).
 
08-07.pl
mag(etienne,X) :- fach2(X), !, fail .
mag(etienne,X) :- schule(X).

schule(X) :- fach1(X).
schule(X) :- fach2(X).
schule(X) :- non_fach(X).

non_fach(hofpause).
non_fach(mittagspause).
non_fach(kleine_pause).

fach1(sport).
fach1(musik).
fach1(kunst).

fach2(deutsch).
fach2(englisch).
 
08-08.pl
neg(Ziel) :- Ziel, !, fail.
neg(_).
 
08-07a.pl
mag(etienne,X) :- schule(X), \+ fach2(X).

schule(X) :- fach1(X).
schule(X) :- fach2(X).
schule(X) :- non_fach(X).

non_fach(hofpause).
non_fach(mittagspause).
non_fach(kleine_pause).

fach1(sport).
fach1(musik).
fach1(kunst).

fach2(deutsch).
fach2(englisch).
 
08-09.pl
not_member(X, L) :- \+ member(X, L).
 

Woche 09

 
09-01.pl
sun(X) :-
    retract(sad(X)),
    assert(happy(X)).
 
09-02.pl
:- dynamic lookup/2.

fak(0, 1).
fak(N, X) :- lookup(N, X), !.
fak(N, X) :- N > 0,
    N2 is N - 1,
    fak(N2, X2),
    X is N * X2,
    assert(lookup(N, X)).
 
09-03.pl
child(martha, charlotte).
child(charlotte, caroline).
child(caroline, laura).
child(laura, rose).
descend(X, Y) :- child(X, Y).
descend(X, Y) :- child(X, Z), descend(Z, Y).

% Try
%
% ?- descend(martha, X).
%
% ?- findall(X, descend(martha, X), L).
 

Woche 10

 
10-01.pl
summe(S, N) :-
read(S, X),
\+ X = end_of_file, !,
summe(S, N2), N is N2 + X.

summe(_, 0).
 
printActors.pl
:- ensure_loaded([kinodb]).

printActors(F) :-
    setof(S, R^film(F, R, S), L),
displayList(L).
    displayList([]) :- nl.
displayList([X|L]) :-
    write(X), tab(1), displayList(L).

% test:
% ?- printActors('Casablanca').
% Humphrey Bogart Ingrid Bergmann
% true.
 
printMovies.pl
:- ensure_loaded([kinodb]).

printMovies(R) :-
    setof(F, S^film(F, R, S),L),
    displayList(L).

displayList([]) :- nl.
displayList([X|L]) :-
    write(X), nl, displayList(L).

% test:
% ?- printMovies('Ridley Scott').
% Alien
% Blade Runner
 

 

Woche 11

 
11-01.pl
s(Z) :- np(X), vp(Y), append(X,Y,Z).
np(Z) :- det(X), n(Y), append(X,Y,Z).
vp(Z) :- v(X), np(Y), append(X,Y,Z).
vp(Z) :- v(Z).
det([a]).
det([the]).
n([woman]).
n([man]).
v([shoots]).
 
11-02.pl
s(Z) :- append(X,Y,Z), np(X), vp(Y).
np(Z) :- append(X,Y,Z), det(X), n(Y).
vp(Z) :- append(X,Y,Z), v(X), np(Y).
vp(Z) :- v(Z).
det([a]).
det([the]).
n([woman]).
n([man]).
v([shoots]).
 
11-03.pl
s(X, Z) :- np(X, Y), vp(Y, Z).
np(X, Z) :- det(X, Y), n(Y, Z).
vp(X, Z) :- v(X, Y), np(Y, Z).
vp(X, Z) :- v(X, Z).
det([the|W], W).
det([a|W], W).
n([woman|W], W).
n([man|W], W).
v([shoots|W], W).
 
11-04.pl
s --> np, vp.
np --> det, n.
vp --> v, np.
vp --> v.
det --> [the].
det --> [a].
n --> [woman].
n --> [man].
v --> [shoots].
 
11-05.pl
s --> np, vp.
np --> det, ne.
ne --> n.
ne --> a, ne.
vp --> v, np.
det --> [the].
det --> [a].
n --> [dog].
n --> [bone].
n --> [mouse].
n --> [cat].
v --> [ate].
v --> [chases].
a --> [big].
a --> [brown].
a --> [lazy].
 
11-06.pl
essen --> essen, ['mit'], zutat.
essen --> zutat.
zutat --> ['Kartoffeln'].
zutat --> ['Sahne'].
zutat --> ['Zwiebeln'].
zutat --> ['Schokoladenstreusel'].
 
11-07.pl
essen --> zutat.
essen --> essen, ['mit'], zutat.
zutat --> ['Kartoffeln'].
zutat --> ['Sahne'].
zutat --> ['Zwiebeln'].
zutat --> ['Schokoladenstreusel'].
 
11-08.pl
s --> [].
s --> l, s, r.
l --> [a].
r --> [b].
 

 

Literatur

[BBS] Patrick Blackburn, Johan Bos, Kristina Striegnitz, Learn PROLOG Now!. Kings College Publications, 2006. Online version.
[SS] Ehud Shapiro, Leon Sterling, The Art of PROLOG: Advanced Programming Techniques. 2nd Edition, MIT Press, 1994.

Programmierressourcen

SWI-Prolog. Eine Kurzanleitung für den Einstieg in SWI-Prolog.