2014-04-09 10 views
9

Hey Leute, ich mache dieses Semester einen AI-Kurs, in dem wir Prolog lernen. Unser Dozent hat uns gesagt, wir sollten versuchen, Kürzungen in unserem Auftrag zu vermeiden, aber für einige der Fragen, die ich nicht vermeiden kann, sie zu verwenden. Ich bin nur neugierig, warum Schnitte als Sünde betrachtet werden (Worte des Lehrers)? Ich verstehe, dass es eine Art Abkürzung ist, aber ich habe sie benutzt, genau wissend, wie sie mein Programm beeinflussen.Sind Schnitte so schlecht in der Programmierung?

Danke.

+3

Es gibt nichts besonders falsch mit ihm, mit der Ausnahme, dass Ihre Programmlogik wird schwieriger zu folgen. In gewisser Hinsicht bringen Kürzungen und Aufgaben Ihr logisches Programm einem imperativen Programm näher - etwas, das Sie unbedingt vermeiden sollten, wenn Sie Prolog verstehen wollen (im Gegensatz zum einfachen Bestehen des Kurses). – dasblinkenlight

+4

Schnitte sind ein Werkzeug wie alles andere, das für den Job passend ausgewählt werden muss. Ihr Kursleiter empfiehlt sie, weil Anfänger sie oft als schnelle Möglichkeit verwenden, ihre Ausgabe "ordentlicher" zu machen, indem sie keine zusätzlichen Lösungsversuche zeigen, wenn sie tatsächlich Szenarien sehen, die sie wirklich sehen wollen. Ohne es zu wissen, haben sie Lösungen abgeschnitten, die sie vielleicht in einem anderen Fall wollen. Sie sollten daher nicht als eine Möglichkeit verwendet werden, die Ausgabe zu "vernetzen", sondern als eine sorgfältig durchdachte Möglichkeit, einen Auswahlpunkt in der Logik zu eliminieren. – lurker

+4

Wenn Sie auf bestimmte Probleme stoßen, bei denen Sie das Gefühl haben, dass Sie einen Schnitt verwenden müssen, können Sie sie als Fragen auf StackOverflow.com veröffentlichen. Die Frage stellen: "Wie kann ich diesen Code ohne Schnitte machen?" ist eine gute Prolog Frage zu stellen. :) – lurker

Antwort

9

Ich stimme @dasblinkenlight und @mbratch zu. Außerdem denke ich, dass es hilfreich ist, in grünen Schnitten und roten Schnitten zu denken.

Ein grüner Schnitt ist einer, der das logische Verhalten des Programms nicht beeinflusst, nur die Leistung. Sie sind ein Weg für Sie, Prolog zu sagen, dass Sie wissen, wenn es weitergeht, wird es keine Früchte tragen. Grüne Schnitte sind nie notwendig -sie verbessern nur die Leistung. Es gibt noch so viel zu lernen, wenn Sie zum ersten Mal Prolog lernen. Es scheint nur so, als ob Sie zusätzliche Komplexität für einen kleinen Vorteil hinzufügen würden.

Ein roter Schnitt beeinflusst das Verhalten des Programms. Wie @mbratch sagte, werfen neue Benutzer häufig Schnitte um, um die Ausgabe "aufzuräumen". Neue Benutzer behandeln die Prolog-Abfrageaufforderung häufig als die Benutzeroberfläche für ihr Programm. Diese Kürzungen machen ihre Prädikate weniger allgemein und weniger nützlich im Prozess, die Ausgabe schöner zu machen. Es gibt auch einige Alternativen, die klarer sind, wie once/1, die Ihnen ein einziges Ergebnis gibt. Experten verwenden rote Schnitte sehr vorsichtig - es gibt Situationen, in denen es viel effizienter ist als ein logischer Ansatz - aber wenn Sie Zugriff auf eine rein logische Formulierung haben, ist es vorzuziehen. Oft haben Prädikate mit Fehlern in der Verwendung von Kürzungen Probleme mit der "Rückwärts-Korrektheit", die später auftreten, wenn Sie vom Prädikat als Teil anderer Prädikate abhängig sind. Diese können schwer zu debuggen und zu beheben sein.

Ich bin mir nicht sicher, ob ich sie eine "Sünde" nennen würde, aber ich stimme meistens mit Ihrem Professor für Anfänger überein. Es ist am besten, wenn Sie erfahren, Probleme logisch zu lösen, ohne den Schnitt zu verwenden. Dann kann der Schnitt später eingeführt werden, wenn Sie ein besseres Gefühl dafür haben, was einfach ist und was schwer ist. Wenn Sie es zu früh verwenden, sind Sie darauf angewiesen, dass es eine Krücke für die prozedurale Programmierung ist.

+0

Ah ich sehe, ich muss erkennen, dass ich mit den Schnitten eine Abkürzung nahm und nicht wirklich herauszufinden, wie meine Antworten produziert wurden. Vielen Dank! – Achaldo

+1

Gut! Dies ist eine wichtige Erkenntnis auf dem Prolog Weg zur Erleuchtung. :) –

8

Am Anfang versuchen Sie, sich aus einem einfachen Grund auf den reinen deklarativen Teil von Prolog zu konzentrieren: Dies ist der Teil, der Prolog von anderen Programmiersprachen unterscheidet. Konzentriere dich auf den reinen, monotonen Teil der Sprache und vermeide Schnitte ganz. Wie sonst können Sie erwarten, dass Sie in dieses Programmierparadigma eintauchen?

Allerdings werden Sie sicherlich auf bestimmte Herausforderungen stoßen. Insbesondere beim Versuch, if-then-else-Konstrukte und allgemeine Negationen zu kodieren. Wenn die Bedingung für ein solches Konstrukt für den If-Teil erfolgreich sein muss und für den Then-Teil fehlschlagen muss, besteht ein nicht-monotoner Code. Prolog wurde jedoch nie dafür entwickelt, solchen Code sauber zu behandeln.

Stattdessen kennt Prolog nur wenn-dann-Regeln. Sie haben also im Wesentlichen eine Regel für den einen Teil und eine für den anderen Teil. Das wird am Anfang ziemlich ungewöhnlich aussehen, aber es erlaubt Ihnen, sehr reinen Code zu erleben.

Beispiele für reinen Code finden Sie unter my page.

Siehe auch: Features of good Prolog code? Lustig, dass die interessanten Fragen immer auf SO geschlossen werden.

Für grüne oder rote Schnitte ist es selbstverständlich, dass es fast keine grünen Schnitte gibt. Wenn Sie Schnitte auf sichere Weise verwenden möchten, müssen Sie zusätzliche Bedingungen ("Wächter") hinzufügen, die sonst keinen Sinn ergeben.Es ist wirklich etwas für Optimierer, Compilerschreiber und dergleichen.

Um meine Antwort ein bisschen mehr im Gleichgewicht zu halten, hier ist ein Beispiel für eine saubere Art und Weise Effizienz mit Schnitt zu verbessern:

Verwandte Themen