Problem mit Prolog

sabrina21

Grünschnabel
Hallo zusammen, ich habe ein großes Problem in Prolog, ich arbeite an einem Prologprogramm, dass bei der Eingabe eines schwachen Verbs, die Vergangenheitsform ausgibt, zur Erinnerung schwache Verben; das sind Verben die ihre Stammform in der Vergangenheitsform behalten, z.B.

liebte -> lieb(te) im Gegensatz zu starken Verben, die ihren Stamm verändern, z.B.

schlafen -> schlief.

Mein Ansatz war dabei folgender
Code:
%präterialform([spielen], Echo). ergibt die präterialform!
map(abbauen, abbaute).
map(bauen, baute).
map(besiegen, besiegte).
map(führen, führte).
map(glauben, glaubte).
map(holen, holte).
map(intervenieren, intervenierte).
map(jauchzen, jauchzte). 
map(kaufen, kaufte).
map(klettern, kletterte).
map(loben, lobte).
map(musizieren, musizierte).
map(nominieren, nominierte).
map(operieren, operierte).
map(planen, plante).
map(richten, richtete).
map(saugen, saugte).
map(siegen, siegte).
map(spielen, spielte).
map(trauen, traute).
map(unifizieren, unifizierte.)
map(verschachern, verschacherte).
map(wünschen, wünschte).
map(X, X).
präterialform([], []).
präterialform([E|Rest], [AbbE|AbbRest]) :-
  map(E, AbbE),
  präterialform(Rest, AbbRest).

Hierbei müsste man jetzt z.B. folgende Eingabe machen: "präterialform([spielen], Echo)." um die entsprechende Vergangenheitsform zu erhalten. Jetzt will ich das Programm aber mit Hilfe des Prädikats "read" ein paar built-in-Prädikaten und auch atom_chars (Listenverarbeitung) soweit verändern, dass es die Vergangenheitsform selbstständig bildet, ohne wie in meinem Programm auf ein festen Bestand an Wörtern zurück zu greifen. Wüsste jemand ungefähr, wie man das am besten Anfängt? Leider drehe ich mich dabei ganz schön im Kreis.

Alles Liebe ;)

Sabrina
 
Hi.

Kennst du schon das atom_concat Prädikat? ;)

Und bitte wähle einen aussagekräftigen Titel, immer der gleiche ist ja auch langweilig...

Gruß
 
Hi Deepthroat und vielen Dank für Deine Hilfe,
also das atom_concat Prädikat kannte ich noch nicht. Ich habe mich inzwischen darüber ein wenig informiert und verschiedene Ansätze gefunden, aber leider keinen, der dazu führt, dass eine Eingabe, z.B. "lieben" in "liebte" ausgegeben wird.

% atom_concat(?Atom1, ?Atom2, ?Atom3)
% read_term(-Term, +Options)
read_term(-Term...

Hast Du evtl. noch einen weiteren Befehl, den man dabei berücksichtigen muss?

Lieben Gruß

Sabrina
 
Hi Deepthroat und vielen Dank für Deine Hilfe,
also das atom_concat Prädikat kannte ich noch nicht. Ich habe mich inzwischen darüber ein wenig informiert und verschiedene Ansätze gefunden, aber leider keinen, der dazu führt, dass eine Eingabe, z.B. "lieben" in "liebte" ausgegeben wird.

% atom_concat(?Atom1, ?Atom2, ?Atom3)
% read_term(-Term, +Options)
read_term(-Term...

Hast Du evtl. noch einen weiteren Befehl, den man dabei berücksichtigen muss?
Nein, mehr braucht man dafür eigentlich nicht. Aber zeig doch mal deinen Code.

Gruß
 
Hallo nochmal,
da ich diese atom_csoncat - Befehle bis jetzt noch nicht ans Laufen bekommen habe, kann ich leider auch keinen Code vorzeigen.
Mir ist überhaupt nicht klar, wo das Problem liegt, bzw. warum diese Prädikate nicht arbeiten.
Eigentlich soll doch eine Eingabe, z.B. "liebe" eingelesen werden und als "liebte" ausgegeben werden, ich habe als Read-Befehl

Code:
read_term(-Term, +Options)

und wollte erst als "+Options"

Code:
atom_concat(?Atom1, ?Atom2, ?Atom3)

versuchen, doch die Optionen scheinen begrenzt zu sein auf bestimmte Prädikate, leider steige ich insgesamt einfach nicht wirklich durch, es soll zwar ansich eine recht einfache Aufgabenstellung sein, dennoch scheine ich an irgendetwas grundlegendes nicht gedacht zu haben.

Alles Liebe

Sabrina
 
Hallo nochmal,
da ich diese atom_csoncat - Befehle bis jetzt noch nicht ans Laufen bekommen habe, kann ich leider auch keinen Code vorzeigen.
Mir ist überhaupt nicht klar, wo das Problem liegt, bzw. warum diese Prädikate nicht arbeiten.
Eigentlich soll doch eine Eingabe, z.B. "liebe" eingelesen werden und als "liebte" ausgegeben werden, ich habe als Read-Befehl

Code:
read_term(-Term, +Options)

und wollte erst als "+Options"

Code:
atom_concat(?Atom1, ?Atom2, ?Atom3)
Du meinst du hast versucht atom_concat(...) dort anstelle der +Options einzusetzen? Das geht selbstverständlich nicht. Das funktioniert aber eigentlich nie (außer bei Prädikaten die andere Prädikate als Argument erwarten). :confused:

Wenn du read_term verwenden willst, mußt du auch Optionen angeben. Diese sind allerdings exakt festgelegt. Oder du übergibst eine leere Liste, dann kannst du allerdings auch gleich read/1 nehmen.

Warum schreibst du nicht erstmal das map/2 Prädikat so das es allgemein funktioniert? Das ist doch erstmal die Hauptarbeit. Und dann solltest du evtl. nochmal die genaue Aufgabenstellung hier reinstellen...

Gruß
 
Hi dt ;-)

Ja ich hatte ja schon befürchtet, dass der Ansatz daneben ist. Also zur Aufgabenstellung selber, es geht wie gesagt darum ein Prädikat zu schreiben, dass von einem beliebigen schwachen Verb, die Vergangenheitsform bilden kann, also z.B. lieben -> liebte, arbeiten -> arbeitete usw. ich brauche also read Befehle, Befehle mit denen ich Listen verarbeiten kann z.B. atom_chars und weitere Buil-inPrädikate. Ich schaue mir mal dieses map/2 Prädikat genau an.

Gruß
S.
 
Hi.
Also zur Aufgabenstellung selber, es geht wie gesagt darum ein Prädikat zu schreiben, dass von einem beliebigen schwachen Verb, die Vergangenheitsform bilden kann, also z.B. lieben -> liebte, arbeiten -> arbeitete usw.
OK. Das ist einfach.
ich brauche also read Befehle, Befehle mit denen ich Listen verarbeiten kann z.B. atom_chars und weitere Buil-inPrädikate.
Warum? Wie kommst du darauf? Steht das so in der Aufgabenstellung?

Was für ein Prologsystem verwendest du denn eigentlich? Die interaktive Prologsitzung nimmt dir doch das read schon ab? Reicht es denn nicht wenn du "map(lieben, E)." eingibst, das dann das Prologsystem "E = liebte" ausgibt?

Gruß
 
Hi dt,

also ich verwende die SWI Prolog Version 5.6.64 und wenn ich "map(lieben, E)" eingebe, dann kommt "Error: toplevel: undefinedprocedure map/2 (DWIM could not correct goal). Allerdings lese ich gerade erst, wie dieses map-Prädikat überhaupt funktioniert.

"ich brauche also read Befehle, Befehle mit denen ich Listen verarbeiten kann z.B. atom_chars und weitere Buil-inPrädikate."

Naja das ist nur ein Hinweis zu der Aufgabenstellung, der nicht zwingend umgesetzt werden muss, wenn diese Map-Variante gehen würde, könnte die es ja auch tun. vorausgesetzt WENN :rolleyes:

Greetz

;-)
 
In den beiden Büchern zur Einführung in Prolog, mit denen ich arbeite, kann ich leider nichts zu diesem Map-Prädikat finden, falls Du eine Onlinequelle hast, wäre es nett, wenn Du diese ggf. verlinken könntest, denn auch wenn ich "map/2 Prolog" google werde ich nicht fündig.

Gruß
 

Neue Beiträge

Zurück