Prolog matching

22 views
Skip to first unread message

Hans

unread,
May 20, 2018, 8:11:10 AM5/20/18
to SWI-Prolog
Hallo,

ich habe aktuell ein Prolog-Programm, dass prüft, ob ein Satz korrekt ist oder nicht.
Dafür werden die einzelnen Satzbestandteile mittels member geprüft.

Bsp.:

satz(In) :- satz(In,[]).
satz(In,Rest) :- nominalphrase(_,nom,In,R), verbalphrase(R,Rest).
nominalphrase(Genus,Kasus,In,Rest) :- artikel(Genus, Kasus, In, R),adjektiv(In,R) ;nomen(Genus, R, Rest).
verbalphrase(In,Rest) :- verbintransitiv(In,Rest); verbtransitiv(In,R), nominalphrase(_,akk,R,Rest).

artikel(m,nom,In,Rest) :- match(A,In,Rest), member(A,[der,il]).
artikel(f,nom,In,Rest) :- match(A,In,Rest), member(A,[die,la]).
artikel(m,akk,In,Rest) :- match(A,In,Rest), member(A,[den,il]).
artikel(m,akk,In,Rest) :- match(A,In,Rest), member(A,[die,i]).
artikel(f,akk,In,Rest) :- match(A,In,Rest), member(A,[die,le]).

verbintransitiv(In,Rest) :- match(V, In, Rest), member(V,[schläft,dorme]).
verbtransitiv(In,Rest) :- match(V, In, Rest), member(V,[sieht,vede]).
verbtransitiv(In,Rest) :- match(V, In, Rest), member(V,[sehen,vedono]).

adjektiv(In,Rest) :- match(V, In, Rest), member(V,[große,grande]).
adjektiv(In,Rest) :- match(V, In, Rest), member(V,[schönen,belle]).


nomen(m,In,Rest) :- match(V,In,Rest),member(V,[mann,uomo]).
nomen(m,In,Rest) :- match(V,In,Rest),member(V,[männer,uomini]).
nomen(m,In,Rest) :- match(V,In,Rest),member(V,[kater,gatto]).
nomen(f,In,Rest) :- match(V,In,Rest),member(V,[frau,donna]).
nomen(f,In,Rest) :- match(V,In,Rest),member(V,[frauen,donne]).

match(X, [X|Rest], Rest).

Hier steht in der Liste außerdem die Übersetzung des Bestandteils. Gibt es eine Möglichkeit, gezielt, die Übersetzung zu der Satzbestandteile in eine Liste zuführen ? 

Ich möchte also eingeben: satz([die, frau, sieht, den, mann]). und als Antwort [la, donna, vede, il, uomo] bekommen. Ich habe aber keine Ahnung, wie ich die Übersetzungen zu den Wörtern rausfiltern kann.

Vielen Dank für eure Hilfe!




Peter Ludemann

unread,
May 20, 2018, 2:04:30 PM5/20/18
to SWI-Prolog
You might want to use DCGs for this. There are a number of tutorials on the web, plus most Prolog textbooks; and they show how to match singular/plural, case, etc.

Instead of using member/2, I would suggest listing out the possibilities, e.g. like this in DCG notation:
    verbintransitiv --> [schläft].
    verbinstransitiv --> [dorme].

Or have a rule (in this case, not using DCG notation):
    verbintransitiv(In,Rest) :- match(V, In, Rest), wort_verbinstranstiv(V).
with a separate dictionary:
    wort_verbinstranstiv(schläft).
    wort_verbinstranstiv(dorme).
You can extend the dictionary to include grammar attributes, e.g.:
    wort_verbinstranstiv(schläft, third_person_singular, present, german, schlaffen).
    wort_verbinstranstiv(dorme, third_person_singular, present, french, dormir).).
Then you can translate, e.g.:
    übersetz(German, French) :-
        wort_verbinstransitiv(German, Person, Tense, german, _),
        wort_verbinstransitiv(French, Person, Tense, french, _).

I think I've done enough of your homework with that. ;)
Reply all
Reply to author
Forward
0 new messages