2016-04-08 6 views
0

Ich bin neu in Prolog und ich kann mit diesem Problem nicht wirklich, dass irgendwelcher Art und Weise des Umgangs, im Grunde habe ich einen Satz zum Beispiel:PROLOG Wörter aus Zeichenfolge zu extrahieren und sie in Liste setzen

phrase(det(a),np2(adj(large))). 

aus dem Satz oben ich mag in diesem Fall Bestimmer extrahieren können (a) und Adjektiv (groß) und sie in eine Liste setzen, so dass es wie folgt aussieht:

newList[a,large]. 
+0

'neue Liste ([Det, Adj]): - Ausdruck_ (det (Det), np2 (adj (Adj))).' –

Antwort

2

wie Sie arbeiten mit Phrasenstrukturbäumen, welche selbst Grammatikregeln darstellen, könnten Sie die Verwendung von DCGs für Ihre Aufgabe erwägen. Denken Sie zuerst darüber nach, was Ihr Prädikat beschreiben soll: eine Beziehung zwischen einem Phrasenstrukturbaum und einer Liste, die aus den Wörtern dieses Baumes besteht. Du könntest es pstree_words/2 nennen. Betrachten wir die minimale Beispiel unten:

pstree_words(Phrase,List) :- 
    phrase(Phrase,List). 

phrase(det(A),np2(NP)) --> % a phrase is 
    det(A),     % a det followed 
    np2(NP).     % by a np2 

det(a) -->     % a is a determiner 
    [a].      % hence in the list 

np2(adj(A)) -->    % a np2 is 
    adj(A).     % an adj 

adj(large) -->    % large is an adjective 
    [large].     % hence in the list 

Beachten Sie, dass das erste Ziel von pstree_words/2 nicht Ihre Struktur Phrase ist, sondern die eingebaute Prädikat Satz/2 für DCGs Handhabung. Sie können dies bereits für die Worte in dem Phrasenstrukturbaum Abfrage verwenden:

?- pstree_words(phrase(det(a),np2(adj(large))),L). 
L = [a,large] 

Wenn Sie Worte hinzufügen, die Sie nur nach Regeln hinzufügen müssen. Zum Beispiel die Bestimmer „die“ hinzufügen hinzufügen Sie gerade:

det(the) --> 
    [the]. 

neue Phrase Strukturen hinzuzufügen können, fügen Sie einfach neue Regeln Begriff // 2. Wenn Sie jedoch versuchen, pstree_words anders herum abzufragen, also zu fragen, ob eine Wortfolge mit einer bekannten Phrasenstruktur übereinstimmt oder nicht, funktioniert sie nicht. Um dem abzuhelfen, dass Sie die Definition von pstree_words verändern kann/2:

pstree_words(Phrase,List) :- 
    is_phrase(Phrase), 
    phrase(Phrase,List). 

is_phrase(phrase(_,_)). 

Die Tatsache, is_phrase/1 einfach Phrase auf eine zweistellige Struktur beschränkt. Wenn Sie Grammatikregeln hinzufügen, um z. 3-Platz-Strukturen für Phrase Sie fügen auch entsprechende Fakten für is_phrase/1: is_phrase(phrase(_,_,_)) hinzu. Mit diesen Änderungen nun das Prädikat in der anderen Richtung funktioniert auch:

?- pstree_words(PST,[a,large]). 
PST = phrase(det(a),np2(adj(large))) 

Andere möglicherweise interessante Anwendungen: die mit den Worten Sätze [D,large] gibt es?

?- pstree_words(PST,[D,large]). 
D = a, 
PST = phrase(det(a),np2(adj(large))) ? ; 
D = the, 
PST = phrase(det(the),np2(adj(large))) 

Welche Phrasen der gegebenen Struktur gibt es?

?- pstree_words(phrase(det(D),np2(adj(A))),L). 
A = large, 
D = a, 
L = [a,large] ? ; 
A = large, 
D = the, 
L = [the,large] ? ; 
Verwandte Themen