<div class="notebook"> <div class="nb-cell markdown" name="md1"> ## 10. Generate all </div> <div class="nb-cell markdown" name="md3"> *1:* Nimm dein Grammatikprogramm und erweitere es um das Prädikat generate_all/1: * generate_all/1 nimmt eine natürliche Zahl als Argument (Bsp.: generate_all(5)) und * generiert alle grammatischen Sätze dieser Länge. * Die Sätze werden an ihr Prädikat parse/1 (aus Kapitel 9) weitergereicht, so dass alle Sätze sowie alle Ableitungsbäume auf dem Bildschirm ausgegeben werden. </div> <div class="nb-cell markdown" name="md6"> *Tipp:* Verwende fail/0, um Backtracking zu erzwingen. </div> <div class="nb-cell markdown" name="md5"> *2:* Schreibe ein zweistelliges Prädikat generate_all/2, das zwei Zahlen als Argument nimmt (Bsp. generate_all(3,5)) und alle Sätze generiert, deren Länge im Intervall der beiden Zahlen liegt. *3:* Schreibe durchnummerierte Beispielsätze in deine Wissensbasis (ex/2, siehe Übung zu Kapitel 9). Schreiben ein Prädikat 'parse_all/0' , das alle Beispielsätze der Wissensbasis parst. *Tipp:* Verkleinere in der Entwicklungsphase dein Lexikon, um die Ergebnismenge kleiner zu halten. </div> <div class="nb-cell markdown" name="md7"> --- </div> <div class="nb-cell markdown" name="md2"> *HINWEIS* In den ersten beiden Programmfenstern sind die Prädikatsdefinitionen zu tab/ 1 und pprint/1 & pprint_list/ 1' versteckt. Über den Pfeil am rechten Ende, kannst du dir den Code dazu nochmal anschauen. </div> <div class="nb-cell program" data-background="true" data-singleline="true" name="p1"> % pprint/1 & pprint_list/1 pprint(Term):- pprint(Term ,0),!. pprint(Term ,N):- Term =.. [F| Args ], tab(N), write(F), nl, N1 is N+3 , pprintl(Args ,N1). pprintl([H|T] ,N):- pprint(H,N), pprintl(T,N). pprintl([] ,_). % pprint_list/1 pprint_list([]):-!. pprint_list([H|T]) :- write(H), tab(1), pprint_list(T). </div> <div class="nb-cell program" data-background="true" name="p2"> % Grammatikregeln mit Parser s(s(NP, VP)) --> np(NP,(nom,Num,_)), vp(VP,Num). np(np(Det, N),KNG) --> det(Det, KNG), n(N, KNG). vp(vp(V, NP),Num) --> v(V, Num), np(NP, (akk,_,_)). % Lexikon: det(det(der),(nom,sing,mas)) --> [der]. det(det(den),(akk,sing,mas)) --> [den]. det(det(die),(_,sing,fem)) --> [die]. det(det(das),(_,sing,neu)) --> [das]. det(det(die),(_,plur,_)) --> [die]. det(det([]),(_,plur,_)) --> []. %n(n(maus),(_,sing,fem)) --> [maus]. %n(n(maeuse),(_,plur,_)) --> [maeuse]. n(n(katze),(_,sing,fem)) --> [katze]. n(n(katzen),(_,plur,_)) --> [katzen]. n(n(hund),(_,sing,mas)) --> [hund]. n(n(hunde),(_,plur,mas)) --> [hunde]. %n(n(pferd),(_,sing,neu)) --> [pferd]. %n(n(pferde),(_,plur,neu)) --> [pferde]. v(v(jagt),sing) --> [jagt]. v(v(jagen),plur) --> [jagen]. ex(1, [die, katze, jagt, den, hund]). ex(2,[die, hunde, jagen, den, hund]). ex(3,[die, katze, jagt, die, hunde]). </div> <div class="nb-cell markdown" name="md8"> Und hier ist noch der Code von ``parse/1`` und ``test/1`` aus der letzten Übung. </div> <div class="nb-cell program" data-background="true" data-singleline="true" name="p4"> % parse/1 parse(S) :- s(T, S, []), pprint_list(S), nl, pprint(T). % test/1 test(N) :- ex(N,S), parse(S). </div> <div class="nb-cell markdown" name="md4"> Füge im folgenden Fenster deinen Code ein: </div> <div class="nb-cell program" data-background="true" name="p5"> % generate_all/1 % generate_all/2 % parse_all/0 </div> <div class="nb-cell query" name="q1"> generate_all(5). </div> <div class="nb-cell query" name="q2"> generate_all(3,5). </div> <div class="nb-cell query" name="q3"> parse_all. </div> </div>