DedSec Project

prolog — συγκεντρωτικός οδηγός — DedSec Project

prolog — συγκεντρωτικός οδηγός Prolog Μοντέλο λειτουργίας Η Prolog δηλώνει σχέσεις με facts και rules. Η εκτέλεση αναζητεί substitutions που ικανοποιούν ένα ερώτημα. Παράδειγμα Δοκίμασέ το…

Prolog

Μοντέλο λειτουργίας

Η Prolog δηλώνει σχέσεις με facts και rules. Η εκτέλεση αναζητεί substitutions που ικανοποιούν ένα ερώτημα.

Παράδειγμα

parent(ada, ben).
parent(ben, cy).
grandparent(X,Y) :- parent(X,Z), parent(Z,Y).

Δοκίμασέ το με νόημα

Ρώτησε grandparent(ada,Who), βρες το cy με το χέρι και σύγκρινε αποτυχία αναζήτησης με exception.

Σφάλμα που πρέπει να ξεχωρίσεις

Η σειρά clauses και recursion επηρεάζει termination σε υλοποιήσεις με depth-first search.

Για να κρίνεις την άσκηση, κατέγραψε την αρχική είσοδο, την πρόβλεψη και την παρατήρηση σε πραγματικό, συμβατό περιβάλλον Prolog. Δώσε ξεχωριστό παράδειγμα όπου αλλάζει μόνο μία μεταβλητή ή ένα όρισμα. Αν εργάζεσαι χωρίς την αναγκαία εφαρμογή, μελέτησε τη σύνταξη ως παράδειγμα και μην παρουσιάζεις το κείμενο ως εκτελεσμένο test.

Prolog — Αναλυτικός οδηγός εξάσκησης

Μικρή αφετηρία πηγαίου κώδικα

greet(Name) :- format('Hello, ~w!~n', [Name]).
main :- greet('Ada').

Περιβάλλον: swipl -q -s hello.pl -g main -t halt.. Κράτησε αντίγραφο του αρχικού κώδικα και σημείωσε έκδοση εργαλείου. Ξεχώρισε αν η εκτέλεση επιστρέφει τιμή, εμφανίζει κείμενο ή αλλάζει state. Για τις πρώτες δοκιμές χρησιμοποίησε απομονωμένο περιβάλλον, όχι πραγματικούς λογαριασμούς ή δεδομένα.

Ανάλυση του ιδιαίτερου μηχανισμού

Όρισε facts parent/2 και grandparent/2, κάνε queries με πολλές λύσεις, πρόσθεσε recursive ancestor και έλεγξε cycle termination.

Διάγνωση κρίσιμου ορίου

Η σειρά clauses και depth-first search μπορεί να δημιουργήσει ατέρμονη αναδρομή· το = κάνει unification, όχι ισότητα.

Prolog — Διαδρομή ουσιαστικής εξάσκησης

Μια μικρή σχέση προγόνων

Σε αρχείο family.pl για SWI-Prolog γράψε facts και κανόνες που εκφράζουν σχέση προγόνων. Η μεταβλητή αρχίζει με κεφαλαίο γράμμα, το atom με μικρό, και οι όροι τερματίζουν με τελεία.

parent(anna, maria).
parent(maria, nikos).
parent(nikos, eleni).

ancestor(X, Y) :- parent(X, Y).
ancestor(X, Y) :- parent(X, Z), ancestor(Z, Y).

Το ancestor(anna, eleni). πρέπει να επιτύχει. Το ancestor(eleni, anna). αποτυγχάνει με αυτά τα facts. Με ancestor(anna, Who). δες διαδοχικές λύσεις μέσω backtracking, χωρίς να μπερδεύεις την αναζήτηση λύσεων με σειριακή ανάθεση μεταβλητών.

Γιατί η σειρά των στόχων έχει σημασία

Η Prolog συνήθως αναζητεί πρώτα τον αριστερό στόχο και χρησιμοποιεί depth-first αναζήτηση. Αν μεταφέρεις το ancestor(Z,Y) πριν από το parent(X,Z) στον δεύτερο κανόνα, μπορεί να προκύψει μη τερματισμός με αδέσμευτες μεταβλητές. Τρέξε το πείραμα με όριο χρόνου σε ξεχωριστό αρχείο, όχι επάνω σε παραγωγική βάση γνώσης. Η λογική σημασία και η επιχειρησιακή συμπεριφορά δεν είναι το ίδιο πράγμα.

Ένα κυκλικό γράφημα

Πρόσθεσε parent(eleni, anna). ώστε να σχηματιστεί κύκλος. Η απλή αναδρομή δεν καταγράφει κόμβους που έχει ήδη επισκεφτεί και μπορεί να συνεχίσει χωρίς τέλος. Μία καλύτερη σχέση πρόσβασης σε γενικό γράφημα χρειάζεται visited accumulator με memberchk ή αντίστοιχο guard, πριν από κάθε επόμενη αναδρομική κλήση.

Τεστ και ερμηνεία

Σύγκρινε τα αποτελέσματα πριν και μετά την προσθήκη κύκλου, εξήγησε την έννοια του closed-world assumption στο συγκεκριμένο σύνολο facts και γιατί το cut (!) δεν είναι γενική θεραπεία: ενδέχεται να αποκρύψει απολύτως έγκυρες λύσεις. Παράδωσε τρία ερωτήματα επιτυχίας/αποτυχίας, ένα counterexample τερματισμού και τη χρησιμοποιούμενη έκδοση Prolog. Μην παρουσιάζεις αυτό το κείμενο ως εκτέλεση ή ως απόδειξη ολοκλήρωσης χωρίς δοκιμές.