Zum Inhalt springen

Prolog


joyce

Empfohlene Beiträge

Hallo, kennt sich hier jd mit Prolog aus?

Ich habe da eine Prolog-Aufgabe und auch die Lösung dazu.

Nur ich verstehe nicht, wie man zu deser Lösung kommt.

Kann mir das jd bitte Schritt für Schritt erklären? Danke!

Aufgabe:

a(2) :- b.

a(3).

b :- c( _ ).

b.

c(1).

c(4).

Lösung:

?- a(X).

X = 2 ;

X = 2 ;

X = 3.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Kann mir das jd bitte Schritt für Schritt erklären? Danke!

So sicherlich nicht, denn Du bekommst hier nicht Deine Hausaufgaben gemacht. Wenn Du eine fertige korrekte Lösung hast, dann kannst Du anhand dieser versuchen den Quellcode zu verstehen. Es ist nicht schwer die Ausgaben nachzuvollziehen.

Welche Gedanken hast Du Dir gemacht?

Phil

Link zu diesem Kommentar
Auf anderen Seiten teilen

Vielen Dank für die große Hilfe.

Ich will doch nur wissen, wie das funktioniert, damit ich andere Aufgaben von der Sorte machen kann.

Ich will nicht dass jd meine Aufgabe hier löst, die ist sogar schon gelöst. Nur ich verstehe nicht wie man zu dieser Lösung kommt.

Das erste X=2; kommt denke ich von a(2):-b und die anderen? :confused:

Link zu diesem Kommentar
Auf anderen Seiten teilen

Das erste X=2; kommt denke ich von a(2):-b und die anderen? :confused:

Das ist auch soweit richtig. Prolog arbeitet mit Prädikaten und logischen Verknüpfungen. Das Prädikat ist wahr oder eben falsch. Jetzt überleg Dir mal was dann jedes Prädikat aussagt. Vielleicht einmal das etwas anderes geschrieben:


a(2) :-

    b.

oder das ganze mal via Pseudocode

  function a(int x) {

      return a == 2

  }

Aber wie Klotzkopp schon sagt, Du musst Eigenleistung zeigen. Außerdem empfehle ich Dir für Prolog dringend Literatur, wenn Du damit Probleme hast.

Phil

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ob ich die Klausel verstehe? Ich glaube ja.

a(2) :- b. heißt wenn b dann a. Die Anfrage ?a(X). liefert X=2, nach Unifizierung

a(3). Prädikat a hat 3 als Argument,hier hätte ich als Lösung X=3 nach Unifizierung

b :- c( _ ). heißt, wenn c (mit unbekanntem Argument), dann b

b.

c(1).

c(4).

Meine Frage ist jetzt woher kommt die zweite Lösung X=2?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Prolog sucht immer das zuerst auftreffende Prädikat.

a(2) -> b -> true => X=2

a(2) -> b -> c(2) -> c(_) => true => X=2

a(3) -> true => X=3

alle anderen Prädikate werden dann nicht mehr verwendet. Bitte nicht "implizit" denken!

Man macht da häufig Fehler wenn man den Algorithmus so liest, als wäre er in C++ o.ä. geschrieben

Phil

Bearbeitet von flashpixx
Link zu diesem Kommentar
Auf anderen Seiten teilen

SWI-Prolog scheint da meiner Meinung zu sein, aber vielleicht liegt's auch an einer Einstellung.

Man kann, da muss ich aber mal nachschauen, Problog anweisen, entweder immer nur das erste gefundene Prädikat zu prüfen und danach abzubrechen, oder eben alle Prädikate durch zulaufen, das würde dann einem "findall" entsprechen. Standard Einstellung bei mir ist, analog zu Deiner Klotzkopp.

Ich habe grade SWI Prolog unter meinem Ubuntu installiert und in der Standard Installation liefert er das 3 mal.

Man kann aber die Operatoren bzw deren Priorität verändern

Phil

Link zu diesem Kommentar
Auf anderen Seiten teilen

Oh ja, hast recht Klotzkopp. swi-prolog-editor hat mir einmal 4 Lösungen gezeigt und ein anderes mal 3 Lösungen. Keine Ahnung warum.

So, ich denke, ich hab verstanden wie prolog zu den Lösungen kommt. Vielen Dank euch beide. Klotzkopp, deine Schreibweise hat mir sehr geholfen, so habe ich besser verfolgen können, was das Programm macht.

Zur Kontrolle, hier nochmal 4 Aufgaben, die ich gerade selbständig gelöst habe. Habe die noch nicht mit swi-prolog-editor-Lösungen verglichen. Der zeigt mir Lösungen, kann mir aber nicht sagen warum. Deshalb, wünsche ich mir erstmal euere Meinungen.

Aufgabe 1

a(2) :- b.

a(3).

b :- c(_).

b(1).

c(1).

c(4).

Lösung dazu:

?- a(X).

X=2;

X=2;

X=2;

X=3.

Aufgabe 2

a(2) :- b(_).

a(3).

b :- c(_).

b(1).

c(1).

c(4).

Lösung dazu:

?- a(X).

X=2;

X=3.

Aufgabe 3

a(2) :- b.

a(3).

b :- c(_),!.

b(1).

c(1).

c(4).

Lösung dazu:

?- a(X).

X=2;

X=3.

ich glaube a(2) <- b <- c(_) liefert keine Lösungen, weil da das Programm gestoppt wird (durch !/cut)

Aufgabe 4

a(2) :- b.

a(3).

b :- c(_),!,d(_).

b.

c(1).

c(4).

d(1).

d(2).

Lösung dazu:

?- a(X).

X=2;

X=3.

Der Rest wird gestoppt.

STIMMT ALLES SO? :)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...