joyce Geschrieben 20. April 2009 Teilen Geschrieben 20. April 2009 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
flashpixx Geschrieben 20. April 2009 Teilen Geschrieben 20. April 2009 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
joyce Geschrieben 20. April 2009 Autor Teilen Geschrieben 20. April 2009 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: Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 21. April 2009 Teilen Geschrieben 21. April 2009 Nur ich verstehe nicht wie man zu dieser Lösung kommt.Verstehst du denn das Programm? Weißt du, was diese 6 Klauseln aussagen? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
flashpixx Geschrieben 21. April 2009 Teilen Geschrieben 21. April 2009 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
joyce Geschrieben 21. April 2009 Autor Teilen Geschrieben 21. April 2009 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? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 21. April 2009 Teilen Geschrieben 21. April 2009 Meine Frage ist jetzt woher kommt die zweite Lösung X=2?Meiner Meinung nach sollte sogar dreimal die Lösung 2 herauskommen. a(2) <- b a(2) <- b <- C(1) a(2) <- b <- C(4) Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
flashpixx Geschrieben 21. April 2009 Teilen Geschrieben 21. April 2009 (bearbeitet) 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 21. April 2009 von flashpixx Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 21. April 2009 Teilen Geschrieben 21. April 2009 alle anderen Prädikate werden dann nicht mehr verwendet.Aber für C(_) sind doch zwei Lösungen da. Warum sollte die Verarbeitung nach einer abbrechen? SWI-Prolog scheint da meiner Meinung zu sein, aber vielleicht liegt's auch an einer Einstellung. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
flashpixx Geschrieben 21. April 2009 Teilen Geschrieben 21. April 2009 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
joyce Geschrieben 21. April 2009 Autor Teilen Geschrieben 21. April 2009 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? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
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.