ΕΡΓΑΣΗΡΙΟ CLIPS ΑΣΚΗΣΗ 6

Σχετικά έγγραφα
ΕΡΓΑΣΗΡΙΟ CLIPS ΑΣΚΗΣΗ 4

Συστήματα Γνώσης. Πρακτικό Κομμάτι Μαθήματος Προτεραιότητα Κανόνων και Στρατηγικές Επίλυσης Συγκρούσεων

CLIPS Σύντομη Εισαγωγή - Περιγραφή του Μηχανισμού Εκτέλεσης

Εισαγωγή στο κέλυφος ανάπτυξης έµπειρων συστηµάτων του CLIPS

Συστήματα Γνώσης. Πρακτικό Κομμάτι Μαθήματος Πρότυπα Γεγονότων. Νίκος Βασιλειάδης, Αναπλ. Καθηγητής Τμήμα Πληροφορικής

Συστήματα Γνώσης. Πρακτικό Κομμάτι Μαθήματος Περιορισμοί στις Συνθήκες Κανόνων. Νίκος Βασιλειάδης, Αναπλ. Καθηγητής Τμήμα Πληροφορικής

Συστήματα Γνώσης. Πρακτικό Κομμάτι Μαθήματος Το Σύστημα Κανόνων CLIPS. Νίκος Βασιλειάδης, Αναπλ. Καθηγητής Τμήμα Πληροφορικής

ΕΡΓΑΣΗΡΙΟ CLIPS ΑΣΚΗΣΗ 3

Κανόνες & Μετά κανόνες

Συστήματα Γνώσης. Πρακτικό Κομμάτι Μαθήματος Πρόγραμμα Διαχείρισης καταστάσεων ανάγκης σε συγκρότημα κτηρίων

ΣΕΤ ΑΣΚΗΣΕΩΝ 4. Προθεσμία: 17/1/14, 22:00

ΕΡΓΑΣΤΗΡΙΟ CLIPS ΑΣΚΗΣΗ 2

1. Άνοιγμα Και Κλείσιμο Της Εφαρμογής Φυλλομετρητή Ιστού (Internet Explorer)

ΕΡΓΑΣΤΗΡΙΟ 16. Χρησιμοποιώντας τον Αποσφαλματιστή (Debugger) του Eclipse

Συστήματα Γνώσης. Πρακτικό Κομμάτι Μαθήματος Συναρτήσεις στο CLIPS. Νίκος Βασιλειάδης, Αναπλ. Καθηγητής Τμήμα Πληροφορικής

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΥΠΟΛΟΓΙΣΤΩΝ & ΥΠΟΛΟΓΙΣΤΙΚΗ ΦΥΣΙΚΗ

Αλλαγή προσανατολισμού εγγράφου σε κατακόρυφο ή οριζόντιο, αλλαγή μεγέθους σελίδας

Συστήματα Γνώσης. Πρακτικό Κομμάτι Μαθήματος Πρόγραμμα Στοιβάσματος Κιβωτίων. Νίκος Βασιλειάδης, Αναπλ. Καθηγητής Τμήμα Πληροφορικής

Συστήματα Γνώσης. Πρακτικό Κομμάτι Μαθήματος Πρόγραμμα Κίνησης Robot. Νίκος Βασιλειάδης, Αναπλ. Καθηγητής Τμήμα Πληροφορικής

Συστήματα Γνώσης. Πρακτικό Κομμάτι Μαθήματος Πρόγραμμα Διάγνωσης Βλάβης βασισμένης σε Μοντέλο. Νίκος Βασιλειάδης, Αναπλ. Καθηγητής Τμήμα Πληροφορικής

ΕΡΓΑΣΤΗΡΙΟ CLIPS ΑΣΚΗΣΗ 1

ΠΡΟΓΡΑΜΜΑΤΙΣΤΗΣ ΑΡΔΕΥΣΗΣ ΓΙΑ ΟΙΚΙΑΚΕΣ & ΕΛΑΦΡΙΕΣ ΔΗΜΟΣΙΕΣ ΕΦΑΡΜΟΓΕΣ ΟΔΗΓΙΕΣ ΕΓΚΑΤΑΣΤΑΣΗΣ & ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ

ΣΕΤ ΑΣΚΗΣΕΩΝ 4. Προθεσµία: 22/12/2016, 21:00

BHMATA ΓΙΑ ΑΝΑΒΑΘΜΙΣΗ ΣΤΟ 3S/I.T.P.

Rule Based systems Συστήματα Βασισμένα σε κανόνες

Οικονόμου Παναγιώτης. Οι διαφάνειες παρουσιάζονται κατόπιν άδειας της Δρ. Ελπινίκης Παπαγεωργίου.

ΣΕΤ ΑΣΚΗΣΕΩΝ 4. Προθεσµία: 13/1/13, 22:00

Αναζήτηση Φορέα Συνεργασίας

Εργαστήριο Δομημένος Προγραμματισμός (C#) Τμήμα Μηχανολογίας Νικόλαος Ζ. Ζάχαρης Καθηγητής Εφαρμογών

SilverPlatter WebSPIRS 4.1.

Οδηγός γρήγορης αναφοράς

Χρησιμοποιώντας συναρτήσεις

ΗΜΥ 213. Εργαστήριο Οργάνωσης Ηλεκτρονικών Υπολογιστών και Μικροεπεξεργαστών LAB 1 ( )

ΠΑΝΕΠΙΣΤΗΜΙΟ ΠΕΙΡΑΙΩΣ. Εργαστηριακές Ασκήσεις για το Μάθημα «Δίκτυα Υπολογιστών I»

(3) Από την εργαλειοθήκη επιλέξτε το εργαλείο «ετικέτας (Label)». Δημιουργήστε μια ετικέτα στην φόρμα σας.

Αναπαραγωγή με αρχεία ήχου

PRO-C ΠΡΟΓΡΑΜΜΑΤΙΣΤΗΣ ΑΡΔΕΥΣΗΣ ΓΙΑ ΟΙΚΙΑΚΕΣ & ΕΛΑΦΡΙΕΣ ΔΗΜΟΣΙΕΣ ΕΦΑΡΜΟΓΕΣ ΟΔΗΓΙΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ

lab13grades Άσκηση 2 -Σωστά απελευθερώνετε ολόκληρη τη λίστα και την κεφαλή

Εργαστήριο «Βάσεις Οικολογικών Δεδομένων και Εφαρμογές»

ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΙΑΣ ΣΧΟΛΗ ΘΕΤΙΚΩΝ ΕΠΙΣΤΗΜΩΝ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ

Σύντομες εισαγωγικές σημειώσεις για την. Matlab

Κατανεμημένα Συστήματα

Ενσωματωμένα Συστήματα

ΦΥΛΛΟ ΕΡΓΑΣΙΑΣ: Εντολές κίνησης και στροφής στο προγραμματιστικό περιβάλλον Scratch. ΟΝΟΜΑΤΕΠΩΝΥΜΟ:

ΜΑΘΗΜΑ 10 Ο ΟΡΓΑΝΩΣΗ ΤΗΣ Β ΓΙΑ ΧΡΗΣΤΕΣ (NON-EXPERTS) Α. ΗΜΙΟΥΡΓΙΑ ΠΙΝΑΚΑ ΕΠΙΛΟΓΩΝ 1. TOOLS DATA UTILITIES SWITCHBOARD MANAGER YES

Ελέγξτε την ταινία σας

Λογισμικό Διαχείρισης Περιεχομένου

Εγχειρίδιο Χρήσης Ενημέρωσης Λογισμικού Bluetooth Windows 7

ΑΣΚΗΣΗ 6: ΔΕΙΚΤΕΣ. Σκοπός της Άσκησης. 1. Εισαγωγικά στοιχεία για τους Δείκτες

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ. Ενότητα: Χρήση εργαλείων Εικόνων, Εντολών και Ετικετών ΚΥΡΟΠΟΥΛΟΣ ΚΩΝΣΤΑΝΤΙΝΟΣ. Τμήμα Διοίκηση Επιχειρήσεων (Κοζάνη)

Αντικειμενοστραφής Προγραμματισμός I (5 ο εξ) Εργαστήριο #4 ο : Αποσφαλμάτωση (debugging), μετατροπές

Λειτουργικά Συστήματα

ΑΣΚΗΣΗ 1: TO ΠΕΡΙΒΑΛΛΟΝ ΕΡΓΑΣΙΑΣ DEV-C++

Αντικειμενοστραφής Προγραμματισμός I(5 ο εξ) Εργαστήριο #4 ο : Αποσφαλμάτωση (debugging), μετατροπές

ΕΝΟΤΗΤΑ 4 Λήψη Αποφάσεων και Συναρτήσεις Ελέγχου

Εισαγωγή στον Προγραμματισμό

Οδηγίες εγκατάστασης και χρήσης Java σε προσωπικό υπολογιστή

Κέντρο υποστήριξης HP. Εισαγωγή. Τι χρειάζεται να γνωρίζετε. Λήψη και εγκατάσταση της λύσης Vista στα Windows 8. 1 of 5 1/7/2014 2:09 μμ

App Inventor 3ο Μάθημα (Ζάρια - επέκταση)

Εισαγωγή στον Προγραμματισμό

Υπηρεσία Πληροφορικών Συστημάτων Τομέας Συστημάτων

ΕΡΓΑΣΤΗΡΙΟ 9: Συμβολοσειρές και Ορίσματα Γραμμής Εντολής

Ανάπτυξη εφαρμογής Input-Output

CAMIN V5 CONTROL AND MONITORING INSTRUMENT NETWORK

Τεχνητή Νοημοσύνη (ΥΠ23) 6 ο εξάμηνο Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο Ουρανία Χατζή

Σενάριο 17: Παιχνίδι μνήμης με εικόνες

Ψευδοκώδικας. November 7, 2011

SMPcache. Ένα εργαλείο για προσομοίωση-οπτικοποίηση κρυφής μνήμης (Cache)

TEC610 Δυναμικές Εφαρμογές Διαδικτύου (ΣΤ εξάμηνο)

MultiBoot Οδηγός χρήσης

Δυναμικές Ιστοσελίδες Εισαγωγή στην Javascript για προγραμματισμό στην πλευρά του client

ΗΜΥ 213 Εργαστήριο Οργάνωσης Ηλεκτρονικών Υπολογιστών και Μικροεπεξεργαστών

Ενημέρωση του Firmware για Ασύρματα Τηλεχειριστήρια WR-R10

Διαδικτυακό Περιβάλλον Διαχείρισης Ασκήσεων Προγραμματισμού

Ζωντανή τάξη μαθήματος

Οδηγίες EQL Desktop (rev ) ΣΥΝ ΕΣΗ S-710 ΜΕ ΚΑΛΩ ΙΟ USB ΠΡΟΚΑΤΑΡΚΤΙΚΕΣ ΕΡΓΑΣΙΕΣ

Δια γράφοντας... κλωνάρια

Εισαγωγή στο MATLAB. Κολοβού Αθανασία, ΕΔΙΠ,

Εξοικείωση με το πρόγραμμα DEV C++ Επικοινωνία Χρήστη - Υπολογιστή

Οδηγός Χρήσης εφαρμογής

SPEEDO AQUABEAT. Specially Designed for Aquatic Athletes and Active People

Εργαστήριο 1-1 η Άσκηση - Ανάλυση

Προγραμματισμός Διαδικτύου Ασκήσεις Εργαστηρίου

Παραδείγματα Χρήσης του DrJava

FAIL PASS PASS οριακά

Θέµα 2: Φασµατογράφηµα στενής και ευρείας ζώνης, ενός σήµατος οµιλίας. Προέµφαση της οµιλίας. Παράµετροι οµιλίας (Ενέργεια, Pitch, Formants, LPC.

ΣΕΤ ΑΣΚΗΣΕΩΝ 3. Προθεσµία: 18/12/12, 22:00

FirmwareΕνημέρωση του Firmware για Προηγμένες Φωτογραφικές Μηχανές Εναλλάξιμων Φακών Nikon 1, Φακούς 1 NIKKOR και Εξαρτήματα Nikon 1

ΠΡΟΓΡΑΜΜΑΤΙΣΤΗΣ ΑΡ ΕΥΣΗΣ ΜΙΑΣ ΣΤΑΣΗΣ ΜΕ ΗΛΕΚΤΡΟΒΑΝΑ ΚΑΙ ΤΡΙΑ ΑΝΕΞΑΡΤΗΤΑ ΠΡΟΓΡΑΜΜΑΤΑ.

Δραστηριότητα 3: Ρυθμίσεις Oικιακής Ομάδας Τοπικού Δικτύου Η/Υ σε WINDOWS 7 & 8

Ενημέρωση του Firmware της Ψηφιακής Φωτογραφικής Μηχανής SLR

ΤΕΙΘ ΣΤΕΦ - ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ ΜΑΘΗΜΑ: ΕΙΣΑΓΩΓΗ ΣΤΑ ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ (UNIX) ΕΡΓΑΣΤΗΡΙΟ. 3o ΕΡΓΑΣΤΗΡΙΟ

Προγραμματισμός Ι. Δυναμική Διαχείριση Μνήμης. Δημήτρης Μιχαήλ. Ακ. Έτος Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

ΕΡΓΑΣΤΗΡΙΟ 3: Προγραμματιστικά Περιβάλλοντα και το Πρώτο Πρόγραμμα C

Message Broadcasting. Περιβάλλον λειτουργίας. Εγκατάσταση του Message Broadcasting. Δημιουργία μηνυμάτων. σημείωση

ΔΙΚΤΥΑ ΕΠΙΚΟΙΝΩΝΙΩΝ Εργαστηριακή Άσκηση 3

Οδηγίες Προγραμματισμού αναβαθμισμένου Προγραμματιστή RAIN DIAL

Lab 2 Manual - Introduction to Xilinx

WiFi V-Timer ΕΚΔΟΣΗ 2Η

Αριστείδης Παλιούρας Ανακαλύψτε το Scratch 2

Transcript:

ΑΣΚΗΣΗ 6 Πρωταρχική μέθοδος αναπαράστασης γνώσης στο CLIPS είναι οι κανόνες. Στις δύο προηγούμενες εργαστηριακές ασκήσεις είδαμε κανόνες με τρεις τύπους συνθηκών: Συνθήκες Προτύπου, Συνθήκες Διεύθυνσης Προτύπου και Εκτιμήσιμες Συνθήκες. Σε αυτήν την εργαστηριακή άσκηση εξακολουθούμε να ασχολούμαστε με τους κανόνες γενικά, ενώ παρουσιάζονται επιπλέον και κανόνες με Λογικούς Συνδέσμους στις συνθήκες τους. Κανόνες στο CLIPS Δημιουργήστε ένα αρχείο.clp και μέσα σε αυτό ορίστε τους παρακάτω κανόνες: (defrule r0?s<-(start) (assert (step1)) (printout t "Shmera ")) (defrule r1?s<-(step1) (assert (step2)) (printout t "einai ")) (defrule r2?s<-(step2) (assert (step3)) (printout t "mia ")) (defrule r3?s<-(step3) (assert (step4)) (printout t "poly ")) (defrule r4?s<-(step4) (assert (step5)) (printout t "kalh mera. ")) (defrule r5?s<-(step5) (assert (step6)) (printout t "Xtes ")) (defrule r6?s<-(step6) (assert (step7)) (printout t "vevaia ")) (defrule r7?s<-(step7) (assert (step8)) (printout t "h mera ")) (defrule r8?s<-(step8) (assert (step9)) (printout t "htan ")) (defrule r9?s<-(step9) (printout t "kalyterh." crlf)) 44

Παρατηρήστε τους παραπάνω κανόνες για να καταλάβετε τι κάνουν. Φορτώστε το αρχείο σας στο CLIPS, ανοίξτε τα παράθυρα Facts και Agenda, εισάγετε το γεγονός (start) και δώστε την εντολή (run). Ποιο είναι το αποτέλεσμα της εκτέλεσης των κανόνων; Παρατηρήστε τα γεγονότα (start), (step 1),,(step9). Τα γεγονότα αυτά αποτελούν γεγονότα ελέγχου (control facts) γιατί χρησιμοποιούνται σε έναν κανόνα, με μοναδικό σκοπό την ενεργοποίηση και εκτέλεση ενός άλλου κανόνα. Εκτελέστε τις παρακάτω εντολές και παρατηρήστε τι συμβαίνει: (set-break r3) Την εντολή set-break την είδαμε και στην προηγούμενη εργαστηριακή άσκηση. Θυμηθείτε τι κάνει. Ποιο το περιεχόμενο του παραθύρου Agenda μετά την εκτέλεση; Αν δώσουμε ξανά την εντολή (run) τι θα συμβεί; Επιβεβαιώστε. Εκτελέστε τώρα τις παρακάτω εντολές και παρατηρήστε τι συμβαίνει στα παράθυρα Facts και Agenda: (remove-break r3) (show-breaks) (set-break r2) (set-break r7) (set-break r9) (rules) (show-breaks) Τι κάνει η εντολή remove-break και τι η εντολή show-breaks; Δώστε διαδοχικά όσες φορές χρειαστεί την εντολή (run) μέχρι την στιγμή που δεν υπάρχουν πλέον ενεργοποιημένοι κανόνες για να εκτελεστούν. Παρατηρήστε το αποτέλεσμα των διακοπών που έχουμε εισάγει πριν από τους συγκεκριμένους κανόνες. Οι διακοπές είναι πολύ χρήσιμες όταν θέλουμε να κάνουμε debugging. Αφαιρέστε τις διακοπές που τέθηκαν πιο πάνω και προσθέστε μια διακοπή στον κατάλληλο κανόνα, ώστε με την πρώτη εντολή (run) να εκτυπώνεται η πρώτη από τις δύο προτάσεις μέχρι την τελεία και να χρειάζεται να δοθεί δεύτερη εντολή (run) προκειμένου να εκτυπωθούν οι λέξεις της δεύτερης πρότασης. Τρέξτε ξανά τους κανόνες και επιβεβαιώστε ότι συμβαίνει αυτό που ζητείται. Όπως έχουμε πει σε προηγούμενη εργαστηριακή άσκηση, στο CLIPS μπορούν να ορίζονται διαφορετικά modules που λειτουργούν ανεξάρτητα μεταξύ τους. Για να δείτε πως λειτουργεί αυτό με τους κανόνες αλλάξτε το αρχείο σας όπως φαίνεται πιο κάτω: 45

(defmodule OTHER) (defrule r0?s<-(start) (assert (step1)) (printout t "Shmera ")) (defrule r1?s<-(step1) (assert (step2)) (printout t "einai ")) (defrule r2?s<-(step2) (assert (step3)) (printout t "mia ")) (defrule r3?s<-(step3) (assert (step4)) (printout t "poly ")) (defrule r4?s<-(step4) (printout t "kalh mera. ")) (defrule r0?s<-(start) (assert (step1)) (printout t "Xtes ")) (defrule r1?s<-(step1) (assert (step2)) (printout t "vevaia ")) (defrule r2?s<-(step2) (assert (step3)) (printout t "h mera ")) (defrule r3?s<-(step3) (assert (step4)) (printout t "htan ")) (defrule r4?s<-(step4) (printout t "kalyterh. " crlf)) Τι κάνει η εντολή (defmodule OTHER); Θυμηθείτε πως όταν ορίζουμε έναν κανόνα που έχει ίδιο όνομα με έναν ήδη υπάρχοντα κανόνα προκαλούμε την αντικατάσταση του παλιού κανόνα από τον καινούργιο. Βάσει αυτών, τι περιμένετε να συμβεί με τον ορισμό της δεύτερης ομάδας κανόνων που έχουν ίδια ονόματα με αυτούς της πρώτης ομάδας αν όλοι οι κανόνες οριστούν στο ίδιο module; Σε ποιο module ανήκουν οι κανόνες της πρώτης ομάδας και σε ποιο εκείνοι της δεύτερης ομάδας; Από που το καταλαβαίνουμε αυτό αφού δεν δηλώνεται ρητά; Κάνετε τα παρακάτω αφού καθαρίσετε το περιβάλλον του CLIPS και φορτώσετε το νέο αρχείο: (get-current-module) (rules) 46

(ppdefrule r0) (set-current-module MAIN) (rules) (ppdefrule r0) Ο κανόνας r0 που εκτυπώνεται την πρώτη φορά είναι ο ίδιος με τον κανόνα r0 που εκτυπώνεται την δεύτερη φορά; Σε ποιο σημείο διαφέρουν οι κανόνες αυτοί και τι άλλο έχουν κοινό εκτός από το όνομα. Αν εισάγουμε το γεγονός (start) που ικανοποιεί και τους δύο κανόνες θα ενεργοποιηθούν και οι δύο; Ελέγξτε το. Δώστε την εντολή (run). Ποιος από τους δύο κανόνες r0 εκτελέστηκε και γιατί; Δώστε την εντολή (retract *). Μεταφερθείτε με την κατάλληλη εντολή στο module OTHER. Εισάγετε το γεγονός (start) και δείτε αν ενεργοποιούνται και οι δύο κανόνες r0 αυτή τη φορά. Στη συνέχεια δώστε ξανά την εντολή (run). Ποιος από τους δύο κανόνες r0 θα έπρεπε να εκτελεστεί και γιατί; Ποιος εκτελέστηκε τελικά; Όπως παρατηρείτε, ενώ αρχικά είμαστε το module OTHER και ενώ έχουμε εισάγει το γεγονός που ικανοποιεί την μοναδική συνθήκη του κανόνα r0 του συγκεκριμένου module, ο κανόνας αυτός ενεργοποιείται αλλά δεν εκτελείται όταν δώσουμε την εντολή (run). Αυτό ισχύει γιατί εξ ορισμού, το module που έχει την «άδεια» να εκτελεί κανόνες (στο CLIPS αυτό εκφράζεται ως το focus module) είναι το module MAIN. Όταν η «άδεια» εκτέλεσης κανόνων (focus) δίνεται σε ένα module μπλοκάρεται αυτόματα η εκτέλεση κανόνων σε όλα τα υπόλοιπα modules ακόμα κι αν υπάρχουν κανόνες τους που ικανοποιούνται. Δώστε την εντολή (getcurrent-module) και δείτε σε ποιο module είμαστε μετά την εντολή (run). Για να μπορέσουν να εκτελεστούν οι κανόνες ενός module πρέπει το module αυτό να πάρει την ιδιότητα focus με την εντολή: (focus <module-name>). Κάνετε τα παρακάτω και παρατηρήστε τι συμβαίνει: (focus OTHER) (get-focus-stack) (facts) ;Σο γεγονός start το έχουμε ήδη προσθέσει εδώ (get-focus-stack) (get-current-module) Η εντολή (get-focus-stack) επιστρέφει την στοίβα η οποία περιέχει σε σειρά τα modules στα οποία έχει δοθεί ως τώρα η ιδιότητα focus. Όταν η εντολή focus καθιστά ένα module τρέχων focus module, τότε το νέο focus module γίνεται pushed στην στοίβα αυτή. Αφού εκτελεστούν οι κανόνες του τρέχοντος focus module το module γίνεται popped από το focus stack και τρέχων focus module γίνεται το αμέσως επόμενο module της στοίβας, Η παραπάνω διαδικασία επαναλαμβάνεται έως την στιγμή που δεν υπάρχουν πλέον άλλα modules στην στοίβα, οπότε focus module είναι το module MAIN. 47

Συνεχίστε με τις επόμενες ενέργειες: (set-current-module MAIN) Παρατηρήστε πως όταν εισάγουμε το γεγονός (start) και δίνουμε την εντολή (run) η ιδιότητα focus είναι αυτή που καθορίζει αν θα εκτελεστεί ο ενεργοποιημένος κανόνας r0 του ενός ή του άλλου module. Συνεχίστε ως εξής: (focus OTHER) (set-current-module MAIN) Εξηγείστε τι συμβαίνει στις δύο τελευταίες εντολές. Προσθέστε μια διακοπή στον κανόνα r2 του module MAIN και μια διακοπή στον κανόνα r3 του module OTHER. Στην συνέχεια κάνετε τα εξής και θυμηθείτε πώς κάποιες εντολές μπορούν να χρησιμοποιηθούν και εξειδικευμένα για κάποιο module. Όταν δεν καθορίζεται κάποιο module σαν όρισμα αυτών των εντολών, εννοείται το module ΜΑΙΝ. (set-current-module MAIN) (ppdefrule r0) (ppdefrule OTHER::r0) (show-breaks) (show-breaks OTHER) (set-current-module OTHER) (ppdefrule r0) (ppdefrule MAIN::r0) (show-breaks) (show-breaks MAIN) (focus OTHER) Παρατηρήστε τον τρόπο με τον οποίο αναφερόμαστε μέσα σε κάποιο module σε έναν κανόνα ενός άλλου module. Με βάση αυτό αλλάξτε κατάλληλα τους ορισμούς των κανόνων του αρχείου σας αν θεωρήσουμε πως η εντολή (defmodule OTHER) δεν βρίσκεται εκεί που την βάλαμε αρχικά αλλά στην αρχή σαν πρώτη εντολή του αρχείου. Αφού φορτώσετε τις αλλαγές ελέγξτε αν όλα είναι όπως πρέπει, εκτυπώνοντας τους κανόνες κάθε module για να επιβεβαιώσετε πως βρίσκονται στη σωστή θέση. 48

Οι κανόνες στο CLIPS μπορούν, εκτός από συνθήκες προτύπου, διεύθυνσης προτύπου και εκτιμήσιμες συνθήκες, να έχουν και λογικά συνδεόμενες συνθήκες, δηλαδή συνθήκες που συνδέονται μεταξύ τους με ένα από τα τρία λογικά συνδετικά and, or και not. Αρχικά θα δούμε το στοιχείο or που επιτρέπει σε περισσότερα από ένα διαφορετικά γεγονότα να ενεργοποιήσουν έναν κανόνα. Έστω πως έχουμε τους επόμενους τρεις κανόνες: (defrule system-fault1?x<-(error-status unknown) (pump off) (printout t "The system has a fault." crlf) (assert (error-status confirmed)) (retract?x)) (defrule system-fault2?x<-(error-status unknown) (valve broken) (printout t "The system has a fault." crlf) (assert (error-status confirmed)) (retract?x)) (defrule system-fault3?x<-(error-status unknown) (temp high) (printout t "The system has a fault." crlf) (assert (error-status confirmed)) (retract?x)) Ποια είναι τα μόνα σημεία στα οποία διαφέρουν οι κανόνες αυτοί; Χρησιμοποιήστε το στοιχείο or προκειμένου να αντικαταστήσετε τους τρεις αυτούς κανόνες με έναν μόνο κανόνα system-fault που θα κάνει το ίδιο πράγμα με αυτούς. Θυμηθείτε πως μια συνθήκη or έχει την εξής μορφή: (or <factpattern1> <fact-pattern2> <fact-patternn>). Ορίστε τον κανόνα σε ένα αρχείο.clp, φορτώστε το στο CLIPS, εισάγετε το (error-status unknown) και ένα από τα γεγονότα: (temp high), (valve broken) ή (pump off) και εκτελέστε τον κανόνα. Ορίστε και τον επόμενο κανόνα στο αρχείο σας, δώστε την εντολή (clear), και φορτώστε ξανά το αρχείο στο CLIPS: (defrule system-flow (error-status confirmed) (or (and (temp high) (valve closed)) (and (temp low) (valve open))) (printout t "The system is having a flow problem." crlf)) 49

Στην συνέχεια κάνετε τα παρακάτω και δείτε πως λειτουργεί το στοιχείο and σε συνδυασμό με το στοιχείο or: ) (assert (error-status confirmed)) (assert (temp high)) (assert (valve open)) (assert (error-status confirmed)) (assert (temp low)) (assert (valve closed)) (assert (error-status confirmed)) (assert (temp high)) (assert (valve closed)) (assert (error-status confirmed)) (assert (temp low)) (assert (valve open)) Ορίστε μέσα σε ένα αρχείο CLIPS τους επόμενους κανόνες για να δείτε πως λειτουργεί το στοιχείο not: (defrule high-flow-rate (temp high) (valve open) (not (error-status confirmed)) (printout t "Recommend closing of valve due to high temp" crlf)) (defrule check-valve (check-status?valve) (not (valve-broken?valve)) (printout t "Device "?valve " is OK" crlf)) (defrule double-pattern (data red) (not (data red?x?x)) (printout t "No patterns with red "?x?x "!" crlf )) 50

Φορτώστε το αρχείο στο CLIPS, αφού πρώτα δώσετε την εντολή (clear). Σας βγάζει κάποιο μήνυμα το CLIPS; Μπορείτε να εξηγήσετε γιατί συμβαίνει αυτό; Αλλάξτε την εντολή εκτύπωσης του κανόνα double-pattern ώστε να εκτυπώνει τα εξής: (printout t "No patterns with red and 2 same colours! " crlf ), φορτώστε ξανά το αρχείο και κάνετε τα παρακάτω: (assert (error-status confirmed)) (assert (temp high)) (assert (valve open)) Ποιος κανόνας ενεργοποιείται; Γιατί δεν ενεργοποιείται ο high-flow-rate; Κάνετε αυτό που χρειάζεται προκειμένου να ενεργοποιηθεί και εκτελέστε τον. Συνεχίστε με τις επόμενες ενέργειες: (assert (valve-broken valve1)) (assert (check-status valve1)) (assert (check-status valve2)) (assert (data red)) (assert (data red green green)) Δώστε την εντολή (retract *) και έπειτα εισάγετε ξανά το γεγονός (data red) και εισάγετε το γεγονός (data red green blue). Στην συνέχεια δώστε την εντολή (run). Το στοιχείο not δηλώνει ποιο γεγονός δεν πρέπει να υπάρχει ώστε να ικανοποιείται μια συνθήκη σε κάποιον κανόνα. Το not μπορεί να χρησιμοποιηθεί για ένα μόνο γεγονός κάθε φορά. Πρέπει να χρησιμοποιείται με προσοχή όταν συνδυάζεται με τα στοιχεία and και or αλλά και όταν χρησιμοποιούνται δεσμεύσεις μεταβλητών μέσα σε μια συνθήκη not. Μεταβλητές που έχουν δεσμευτεί σε προηγούμενες συνθήκες χρησιμοποιούνται χωρίς προβλήματα μέσα σε μια συνθήκη not. Αντίθετα, μεταβλητές που δεσμεύονται πρώτη φορά σε μια συνθήκη not μπορούν να ξαναχρησιμοποιηθούν μόνο μέσα στην ίδια συνθήκη και όχι εκτός αυτής. Στην προηγούμενη εργαστηριακή άσκηση είδαμε το στοιχείο συνθήκης (Conditional Element - CE) test. Αυτό το στοιχείο επιτρέπει να κάνουμε συγκρίσεις μέσα στις συνθήκες ενός κανόνα και δημιουργεί εκτιμήσιμες 51

συνθήκες. Εκτός από αυτό υπάρχουν δύο ακόμα αντίστοιχα στοιχεία: το exists και το forall. Το πρώτο ελέγχει την ύπαρξη ενός τουλάχιστον συνδυασμού γεγονότων που ικανοποιεί ένα σύνολο συνθηκών κάποιου κανόνα. Το δεύτερο ελέγχει αν ένα σύνολο συνθηκών κάποιου κανόνα ικανοποιείται από όλους τους αντίστοιχους συνδυασμούς γεγονότων της λίστας γεγονότων. Παρατηρήστε πως λειτουργούν αυτά τα δύο στοιχεία κάνοντας τα εξής: Ορίστε τους επόμενους κανόνες και δομές deffacts σε ένα αρχείο.clp: (defrule rule (simple rule) (woman?x) (printout t "There is a woman!" crlf)) (defrule exist (existrule) (exists (woman?x)) (printout t "There is a woman!" crlf)) (defrule forall (forallrule) (forall (student?name) (reading?name) (writing?name) (arithmetic?name)) (printout t "All students passed." crlf)) (deffacts women (woman Eleni) (woman Maria) (woman Mirsini) (woman Antonia)) (deffacts students (student Michael) (reading Michael) (writing Michael) (arithmetic Michael) (student Bill) (reading Bill) (writing Bill) (arithmetic Bill) (student Helen) (reading Helen) (writing Helen) (arithmetic Helen)) Φορτώστε το αρχείο σας, αφού καθαρίσετε το CLIPS. Στην συνέχεια κάνετε τις παρακάτω ενέργειες: 52

(reset) (assert (simple rule)) (reset) (assert (existrule)) (reset) (assert (forallrule)) (assert (student Bob)) (assert (reading Bob) (writing Bob)) (assert (arithmetic Bob)) Εξηγείστε τα αποτελέσματα των παραπάνω ενεργειών. Παρατηρήστε την διαφορά που υπάρχει στην εκτέλεση όταν χρησιμοποιούμε το στοιχείο exists και όταν δεν το χρησιμοποιούμε. Παρατηρήστε επίσης την λειτουργία του στοιχείου forall. Κλείστε το CLIPS είτε με την εντολή (exit) στο Dialog Window είτε με File->Exit. 53