Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Empfohlene Antworten

Veröffentlicht

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.

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

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:

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

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?

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

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

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? :)

Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.