Künstliche Intelligenz und Prolog
Copyright © 2019 Jiri Kriz, www.nosco.ch

15Natürliche Sprachen II

Lösungen

15.1Syntax und Semantik

Schreiben Sie einen Parser in Prolog nach der Methode der Definite Clause Grammar. Die folgenden Sätze sollten als grammatikalisch richtig erkannt werden:

Das top-level Prädikat ist s(Sentence, Tree), wobei Sentence eine Liste von Wörtern und Tree der erzeugte Syntax-Baum ist, z.B.

?- s([ a, man, arrived], Tree).  ⇒  Tree = . . .

Schreiben Sie auch ein Programm zur schönen Darstellung des Syntax-Baumes und testen Sie es z.B.:

?- s([ a, man, arrived], Tree), write_tree( Tree).

Erweitern Sie den Parser um eine semantische Komponente, sodass die Semantik der obigen Sätze richtig generiert wird:

s(Sentence, Tree, Sem) :- …
?- s([ a, man, arrived], Tree, Sem). 
 ⇒  Sem = exists(X, man(X), arrived(X))

Lösung 15.1

15.2Repräsentation der Semantik in einer Wissensbank

Implementieren Sie das Prädikat declare(Semantics), das die erzeugte Semantik unter einem Funktor kb/1 assertiert. Dazu müssen Sie auch eine Prozedur zur Erzeugung von "Discourse Referents (Markers)" schreiben. Beispiel:

declare(exists(X, man(X), arrived(X)) :- . . ., 
    assert(kb(man(f(5))), assert(arrived(f(5))).

Lösung 15.2

15.3Abfragen

Implementieren Sie das Prädikat solve(Semantics), das die erzeugte Semantik mit Hilfe der Wissensbank kb/1 beweist. Beispiel:

?- solve(exists(X, man(X), arrived(X)).  ⇒  yes

Lösung 15.3

15.4Intelligenter Dialog

Implementieren Sie einen intelligenten Dialog mit dem Computer:

chat(Sentence).
Wenn Sentence mit Who/Does/Did beginnt, so ist es eine Frage und wird (ohne den Anfang) an die Prozedur solve zum Beweisen weitergeleitet.

Andernfalls ist Sentence eine Feststellung, und wird an die Prozedur declare zur Ablage in der Wissensbank weitergeleitet.

Die Sätze im obigen Stil sollten richtig verarbeitet werden. Z.B.:

?- chat([john, loved, mary]).     
?- chat([who, loved, mary]).  ⇒  john
?- chat([who, did, john, love]).  ⇒  mary
?- chat([every, man, likes, mary]).    
?- chat([jack, is, a, man]).    
?- chat([mary, is, a, woman]).    
?- chat([does, jack, likes, mary]).  ⇒  yes

Lösung 15.4