Kennt sich hier wer mit Prolog aus bzw. gibts dafür nen Thread? Ich kapier den Regelaufbau und die Sache mit dem Abbruchfall nämlich grade nicht und bräuchte Hilfe.
//Dieses Thema wurde aus dem PC-Hilfe-Thread ausgeschnitten von Shakka
Kennt sich hier wer mit Prolog aus bzw. gibts dafür nen Thread? Ich kapier den Regelaufbau und die Sache mit dem Abbruchfall nämlich grade nicht und bräuchte Hilfe.
//Dieses Thema wurde aus dem PC-Hilfe-Thread ausgeschnitten von Shakka
Geändert von Shakka (02. November 2013 um 00:22 Uhr)
Prolog, da klingelt was.....aber nicht viel...wenn du eine konkrete Frage stellst, könnte mehr klingeln.
Ich kopiers einfach mal:
Aufgabenstellung ist im Anhang, wenns dir nichts ausmacht 1 1/2 PDF-Seiten zu lesen. Ist Aufgabe 1, auf Seite 2-3.
So, das hab ich bisher geschrieben:
initial(glados, rot).
initial(glados, blau).
verbindung(glados, xerxes).
verbindung(xerxes, gerty).
verbindung(gerty, sentry).
verbindung(sentry, skynet).
verbindung(glados, quora).
verbindung(quora, hal).
verbindung(hal, shodan).
verbindung(glados, wintermute).
filter(sentry, rot).
filter(quora, rot).
filter(quora, blau.)
________________________________
initial(Rechner, Wurm).
filter(Firewall, Wurm).
verbindung(Rechner1OderFirewall1, Rechner2OderFirewall2).
infiziert(Rechner, Wurm) :- initial(Rechner, Wurm).
infiziert(Rechner, Wurm) :- initial(Rechner, Wurm), verbindung(Rechner1OderFirewall1, Rechner2OderFirewall2).
Die Fakten oben sind erstmal nur zum Testen da, also alles oberhalb der Linie. Filter hab ich erstmal unten in der Regel weggelassen, weils ja schon an der Verbindung scheitert. Also die Regel sagt ja: Rechner ist mit Wurm infiziert, wenn eine Verbindung zwischen ihm und einem am Anfang infizierten Rechner besteht. Nur versteh ich irgendwie nicht, wie ich das schreibe bzw. warum es so nicht funktioniert. Wo ist der Denkfehler?
edit: Ups, Anhang vergessen.
Habe keine Ahnung mehr von.
infiziert(Rechner, Wurm) :- initial(Rechner, Wurm).
infiziert(Rechner, Wurm) :- initial(Rechner, Wurm), verbindung(Rechner1OderFirewall1, Rechner2OderFirewall2).
Aber das fette sieht mir ziemlich falsch aus. Da steht ja quasi nur die Prädikatendefinition. Irgendwie muss du ja angeben, welche Verbindung für dich relevant ist. Obendrein hast du ja auch keine Prüfung ob eine Firewall dazwischen ist dabei.
Ja, das ist mir auch klar. Aber ich hab halt keine Ahnung, wie ich das angebe bzw. die Verbindung herstelle.
Die Firewall-Überprüfung hab ich noch nicht eingebunden, weils ja schon am zweiten Teil scheitert grade. Ich steh echt aufm Schlauch.
Abstrakt gesprochen hast du hier eine Eigenschaft (infiziert) vorliegen, die für bestimmte Basis-Objekte leicht zu berechnen ist und über eine Relation auf andere Objekte übertragen wird. Die Relation kann dann rekursiv angewendet werden, was die Menge der erfassten Objekte weiter erhöht (oder nicht weiter verändert). Das kommt in der Mathemaktik/Informatik ständig vor und man spricht dann auch von der Berechnung einer Hülle. (=Menge aller Objekte mit einer Eigenschaft).
Du kennst vielleicht bei den Termumformungen den Begriff der „nahrhaften Null“, bei der man irgendwas einschiebt. Im Prinzip ist das bei vielen rekursiven Definitionen ähnlich
Ist jetzt keine Prologschreibweise, aber es ist ungefähr so:
infiziert(A,W) = initial(A,W)
infiziert(A,W) = verbindung(A,B) UND infiziert(B,W) UND NICHT filter(A,W)
Ich habe die Relationen in dieser Reihenfolge aufgeschrieben, damit man sieht, dass da ein B zwischen A und W „eingefügt“ wurde. Dazu dann am Ende noch die Filtereigenschaft. Statt filter(A,W) könnte man auch filter(B,W) nehmen.
Okay, danke dir schonmal, das Grundprinzip des Ganzen verstehe ich eigentlich mehr oder weniger, nur an der Implementierung haperts.
Ich poste mal meine Ansätze und das Ergebnis:
Wenn ich jetzt infiziert(A, rot) abfrage, lande ich in einer Endlosschleife mit glados. Was bei infiziert(A, W) rauskommt siehst du ja.
Der ausgeblendete Ansatz darüber bringt die gleichen Ergebnisse.
Aha, da ist noch ein Fehler drin. Es muss ja verbindung(B,A) heißen. Eine Endlosschleife sollte eigentlich nicht auftreten können, wenn in der infiziert-Relation keine Zyklen sind.
Geändert von Ramkhamhaeng (01. November 2013 um 22:50 Uhr) Grund: Relationsname korrigiert
Nope, will immer noch nicht. Naja, ich gebs nu auf, sitze schon länger dran und mir geht die Puste aus.
Trotzdem vielen Dank für die Hilfe.
Was würde denn passieren, wenn man den Term
infiziert(a,w) :- \= filter (a,w).
einfügen würde?
Das ist sehr problematisch, da filter(a,w) ja für viele Tupel gar nicht definiert ist. Für diese wäre infiziert ja dann wahr.
Die Auflösung tät mich ja interessieren.
Wir hatten uns damit damals in der Schule auch nicht so lange beschäftigt. Die Negierung eines Tupels hatten wir gar nicht gemacht. Hätte jetzt gedacht, da die eine Abbruchbedingung nur wirkt, wenn das Tupel existiert würde die andere auch nur wirken, wenn das Tupel existiert.