Università degli Studi di Bari Dipartimento di Informatica. Laboratorio di ICSE. CLIPS - Parte 3 - Claudia d'amato claudia.damato@di.uniba.



Documenti analoghi
Corso di Laurea in INFORMATICA

Corso di Laurea in INFORMATICA

Esercitazione CLIPS. Realizzazione di un Sistema a Regole per la Risoluzione del Problema dell'agricoltore

Corso di Laurea in INFORMATICA

Tipi primitivi. Ad esempio, il codice seguente dichiara una variabile di tipo intero, le assegna il valore 5 e stampa a schermo il suo contenuto:

Esercitazione CLIPS (I)

Java: Compilatore e Interprete

Uso di JUnit. Fondamenti di informatica Oggetti e Java. JUnit. Luca Cabibbo. ottobre 2012

GESTIONE INFORMATICA DEI DATI AZIENDALI

Introduzione alla programmazione in C

3 - Variabili. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

Oggetti Lezione 3. aspetti generali e definizione di classi I

Corso di Laurea in INFORMATICA

Sequence Diagram e Collaboration Diagram

Algoritmi di Ricerca. Esempi di programmi Java

Esercitazioni di Progettazione del Software. Esercitazione (Prova al calcolatore del 17 settembre 2010)

DAL DIAGRAMMA AL CODICE

I file di dati. Unità didattica D1 1

Automatizzare i compiti ripetitivi. I file batch. File batch (1) File batch (2) Visualizzazione (2) Visualizzazione

Le variabili. Olga Scotti

Gestione Risorse Umane Web

Regione Toscana. ARPA Fonte Dati. Manuale Amministratore. L. Folchi (TAI) Redatto da

Università degli Studi di Bari Dipartimento di Informatica. Laboratorio di ICSE. CLIPS - Parte 1 - Nicola Di Mauro ndm@di.uniba.it

La gestione dell input/output da tastiera La gestione dell input/output da file La gestione delle eccezioni

Funzioni in C. Violetta Lonati

Progetto Lauree Scientifiche Liceo Classico L.Ariosto, Ferrara Dipartimento di Matematica Università di Ferrara 24 Gennaio 2012

Concetto di Funzione e Procedura METODI in Java

JavaScript. crash course. by Stefano Burigat

Portale tirocini. Manuale utente Per la gestione del Progetto Formativo

Programmazione Funzionale

Java:Struttura di Programma. Fabio Scanu a.s. 2014/2015

CLIPS C Language Integrated Production System

Algebra Booleana ed Espressioni Booleane

Lezione 8. La macchina universale

Introduzione ai tipi di dato astratti: applicazione alle liste

INFORMATICA GENERALE Prof. Alberto Postiglione Dipartimento Scienze della Comunicazione Università degli Studi di Salerno

12 - Introduzione alla Programmazione Orientata agli Oggetti (Object Oriented Programming OOP)

Programmazione C Massimo Callisto De Donato massimo.callisto@unicam.it

Tipi di Dato Ricorsivi

Gli algoritmi: definizioni e proprietà

Elementi di semantica operazionale

Università degli Studi di Bari Dipartimento di Informatica. Laboratorio di ICSE. CLIPS - Parte 2 - Claudia d'amato claudia.damato@di.uniba.

Elementi di semantica denotazionale ed operazionale

La prima applicazione Java. Creazione di oggetti - 1. La prima applicazione Java: schema di esecuzione. Gianpaolo Cugola - Sistemi Informativi in Rete

ISTITUTO TECNICO INDUSTRIALE STATALE LA GESTIONE DEI FILE DI TESTO IN C++

Introduzione a Visual Basic Lezione 1 Concetti base e istruzioni condizionali

Invio SMS. DM Board ICS Invio SMS

Linguaggio C - Stringhe

Matlab: Strutture di Controllo. Informatica B

Esercitazione di Basi di Dati

Introduzione al Linguaggio C

Arduino: Programmazione

Introduzione al Python

Cookie. Krishna Tateneni Jost Schenck Traduzione: Luciano Montanaro

Introduzione alla Programmazione Orientata agli Oggetti. Classi, Oggetti e Messaggi

19. LA PROGRAMMAZIONE LATO SERVER

Scilab: I Polinomi - Input/Output - I file Script

Basi di dati. Il Linguaggio SQL. K. Donno - Il Linguaggio SQL

Istituto Centrale per il Catalogo Unico delle Biblioteche Italiane. e per le Informazioni bibliografiche. Manuali utente per SBN WEB. Versione 1.

Laboratorio Progettazione Web PHP e FORMs HTML. Andrea Marchetti IIT-CNR andrea.marchetti@iit.cnr.ita 2013/2014

Realizzazione di Politiche di Gestione delle Risorse: i Semafori Privati

Progetto: ARPA Fonte Dati. ARPA Fonte Dati. Regione Toscana. Manuale Amministratore

MODELLO CLIENT/SERVER. Gianluca Daino Dipartimento di Ingegneria dell Informazione Università degli Studi di Siena

Analisi sensitività. Strumenti per il supporto alle decisioni nel processo di Valutazione d azienda

Procedure memorizzate SQL-2003/PSM. Forma base di PSM. Parametri in PSM

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2

Raccolta dei Requisiti con i Casi D'uso. Corso di Ingegneria del Software Anno Accademico 2012/13

Laboratorio di Informatica Lezione 2

Dott.ssa Adriana Pietramala. Dott.ssa Maria Vittoria Avolio

APP RIO8 APP PER LA CONFIGURAZIONE GUIDA PER L UTENTE. Omniabit s.r.l. Via Val Camonica 11, Milan, Italy support@omniabit.

Introduzione all' OO in Python

Configurazione della ricerca desktop di Nepomuk. Sebastian Trüg Anne-Marie Mahfouf Traduzione della documentazione in italiano: Federico Zenith

Le query. Lezione 6 a cura di Maria Novella Mosciatti


Inizializzazione, Assegnamento e Distruzione di Classi

Access Control List (I parte)

Le stringhe. Le stringhe

Algebra di Boole: Concetti di base. Fondamenti di Informatica - D. Talia - UNICAL 1. Fondamenti di Informatica

Sistema per scambi/cessioni di Gas al Punto di Scambio Virtuale


Fondamenti di Programmazione

Sistemi Operativi. Interfaccia del File System FILE SYSTEM : INTERFACCIA. Concetto di File. Metodi di Accesso. Struttura delle Directory

Laboratorio di Informatica

Il linguaggio di specifica formale Z

Prof. Giuseppe Chiumeo. Avete già studiato che qualsiasi algoritmo appropriato può essere scritto utilizzando soltanto tre strutture di base:

10 - Programmare con gli Array

Informatica per le discipline umanistiche 2 lezione 14

Architettura MVC-2 A L B E R T O B E L U S S I A N N O A C C A D E M I C O /

Gestione Turni. Introduzione

2.5. L'indirizzo IP identifica il computer di origine, il numero di porta invece identifica il processo di origine.

Volumi di riferimento

Gestione dei servizi all utenza. 3. Autorizzazioni

Gli array. Gli array. Gli array. Classi di memorizzazione per array. Inizializzazione esplicita degli array. Array e puntatori

Definizione di nuovi tipi in C

Logistica magazzino: Inventari

Esercitazione n 4. Obiettivi

Visual Basic.NET La Gestione degli Errori di Federico BARBATI

Corso Analista Programmatore Web PHP Corso Online Analista Programmatore Web PHP

Semantica dei programmi. La semantica dei programmi è la caratterizzazione matematica dei possibili comportamenti di un programma.

I casi d uso corrispondono ai compiti che l attore (che può essere una persona fisica e non) può svolgere.

Transcript:

Università degli Studi di Bari Dipartimento di Informatica Laboratorio di ICSE CLIPS - Parte 3 - Claudia d'amato claudia.damato@di.uniba.it Claudio Taranto claudio.taranto@di.uniba.it

Conoscenza procedurale Il CLIPS supporta anche un paradigma procedurale per la rappresentazione della conoscenza come quello dei linguaggi Pascal e C. Le funzioni (deffunctions) e le funzioni generiche (generic functions) permettono all utente di definire nuovi elementi eseguibili che provocano un effetto collaterale oppure che restituiscono un valore. I message-handlers permettono all utente di definire il comportamento degli oggetti specificando la loro risposta ai Messaggi. Deffunctions, generic functions e message-handlers sono porzioni di codice procedurale specificati dall utente che il CLIPS esegue quando opportuno. Defmodules permette di partizionare la base di conoscenza 2

Elementi di base Una funzione in CLIPS è una porzione di codice eseguibile identificata da uno specifico nome che restituisce un valore o ha un effetto collaterale. Il costrutto deffunction permette all utente di definire nuove funzioni, direttamente nell ambiente CLIPS. COOL Le funzioni generiche possono essere definite utilizzando i costrutti defgeneric e defmethod. Questo tipo di funzioni permettono l esecuzione di diverse porzioni di codice in base agli argomenti passati alla funzione. Quindi, un singolo nome di funzione può essere sovraccaricato con più porzioni di Codice. Clips utilizza la notazione prefissa per le funzioni (* 8 (+ 3 (* 2 3 4) 9) (* 3 4)) 3

Deffunction Le deffunctions sono equivalenti alle altre funzioni, l unica differenza è che le deffunctions sono scritte in CLIPS ed interpretate, mentre le funzioni esterne sono scritte in un linguaggio esterno (come il C) ed eseguite direttamente dal CLIPS. Le deffunctions permetto l aggiunta di nuove funzioni senza ricompilare il CLIPS. (deffunction <name> [<comment>] (<regular-parameter>* [<wildcard-parameter>]) <action>*) <regular-parameter> ::= <single-field-variable> <wildcard-parameter> ::= <multifield-variable> Una deffunction deve avere un unico nome, non esiste l overloading, e deve essere dichiarata prima di essere usata, ad eccezioni delle deffunctions ricorsive. 4

Deffunction (deffunction stampa-argomenti (?a?b $?c) (printout t?a " "?b " e " (length?c) " aggiuntivo: "?c crlf)) (stampa-argomenti 1 2) 1 2 e 0 aggiuntivo: () (stampa-argomenti a b c d) a b e 2 aggiuntivo: (c d) Quando una deffunction viene invocata, le sue azioni sono eseguite nell ordine. Il valore restituito da una deffunction è la valutazione dell ultima azione. Se una deffunction non ha azioni essa restituisce il simbolo FALSE. Se si verifica un errore tutte le azioni non ancora eseguite verranno abortite, e verrà restituito il simbolo FALSE. 5

Costrutti Procedurali If...then...else (if <expression> then <action>* [else <action>*]) Esempio: (defrule valvola-chiusa (temperatura alta) (valvola?v chiusa) => (if (=?v 6) then (printout t "La valvola speciale "?v " è chiusa!" crlf) (assert (esegui operazione speciale)) else (printout t "La Valvola "?v " è normalmente chiusa" crlf))) 6

Costrutti Procedurali While (while <expression> [do] <action>*) (defrule valvole-aperte (valvola aperta?v) => (while (>?v 0) (printout t "Valvola "?v " è aperta" crlf) (bind?v (-?v 1)))) 7

Costrutti Procedurali Loop-for-count (loop-for-count <range-spec> [do] <action>*) <range-spec> ::= <end-index> (<loop-variable> <start-index> <end-index>) (<loop-variable> <end-index>) <start-index> ::= <integer-expression> <end-index> ::= <integer-expression> Esempio: (loop-for-count 2 (printout t "Hello world" crlf)) Hello World Hello world FALSE (loop-for-count (?cnt1 2 4) do (loop-for-count (?cnt2 1 3) do (printout t?cnt1 " "?cnt2 crlf))) 8

Costrutti procedurali 2 1 2 2 2 3 3 1 3 2 3 3 4 1 4 2 4 3 FALSE 9

Costrutti Procedurali (return [<expression>]) (deffunction sign (?num) (if (>?num 0) then (return 1)) (if (<?num 0) then (return -1)) 0) (sign 5) 1 (sign -10) -1 (sign 0) 0 10

Costrutti Procedurali (break) (deffunction iterate (?num) (bind?i 0) (while TRUE do (if (>=?i?num) then (break)) (printout t?i " ") (bind?i (+?i 1))) (printout t crlf)) (iterate 1) 0 (iterate 10) 0 1 2 3 4 5 6 7 8 9 11

Costrutti Procedurali (switch <test-expression> <case-statement>* [<default-statement>]) <case-statement> ::= (case <comparison-expression> then <action>*) <default-statement> ::= (default <action>*) Esempio: (defglobal?*x* = 0) (defglobal?*y* = 1) (deffunction foo (?val) (switch?val (case?*x* then *x*) (case?*y* then *y*) (default none))) (foo 0) *x* (foo 1) *y* (foo 2) none 12

CLIPS: funzioni utili su Multifield Creazione di un valore multifield (create$ <expression>*) (create$ hammer drill saw screw pliers wrench) (hammer drill saw screw pliers wrench) (create$ (+ 3 4) (* 2 3) (/ 8 4)) (7 6 2) Restituzione di un campo specificato all'interno di un multifield (nth$ <integer-expression> <multifield-expression>) Interrogazione se un singolo valore è in un multifield (member$ <expression> <multifield-expression>) Es. (member$ blue (create$ red 3 "text" 8.7 blue)) 5 Verifica se un multifield è sottoinsieme di un altro multifield (subsetp <multifield-expression> <multifield-expression>) 13

CLIPS: funzioni utili su Multifield Cancellazione di campi in un multifield (delete$ <multifield-expression> <begin-integer-expression> <end-integer-expression>) Esempio (delete$ (create$ hammer drill saw pliers wrench) 3 4) (hammer drill wrench) (delete$ (create$ computer printer hard-disk) 1 1) (printer hard-disk) Creazione di un Multifield da Stringhe (explode$ <string-expression>) Esempio (explode$ "hammer drill saw screw") (hammer drill saw screw) (explode$ "1 2 abc 3 4 \"abc\" \"def\"") (1 2 abc 3 4 "abc" "def") (explode$ "?x ~ )") ("?x" "~" ")") 14

CLIPS: funzioni utili su Multifield Creazione di stringhe da valori di un Multifield (implode$ <multifield-expression>) Esempio (implode$ (create$ hammer drill screwdriver)) "hammer drill screwdriver (implode$ (create$ 1 "abc" def "ghi" 2)) "1 "abc" def "ghi" 2 (implode$ (create$ "abc def ghi")) ""abc def ghi" Estrazione di una sottosequenza da un Multifield (subseq$ <multifield-value> <begin-integer-expression> <end-integer-expression>) (subseq$ (create$ hammer drill wrench pliers) 3 4) (wrench pliers) (subseq$ (create$ 1 "abc" def "ghi" 2) 1 1) (1) 15

CLIPS: funzioni utili su Multifield Rimpiazzamento di campi in un Multifield (replace$ <multifield-expression> <begin-integer-expression> <end-integer-expression> <single-or-multi-field-expression>+) Esempio (replace$ (create$ drill wrench pliers) 3 3 machete) (drill wrench machete) (replace$ (create$ a b c d) 2 3 x y (create$ q r s)) (a x y q r s d) Inserimento di campi in un Multifield (insert$ <multifield-expression> <integer-expression> <single-or-multi-field-expression>+) Esempio (insert$ (create$ a b c d) 1 x) (x a b c d) (insert$ (create$ a b c d) 4 y z) (a b c y z d) (insert$ (create$ a b c d) 5 (create$ q r)) (a b c d q r) 16

CLIPS: funzioni utili su Multifield Richiesta del Primo Elemento di un Multifield (first$ <multifield-expression>) Esempio (first$ (create$ a b c)) (a) (first$ (create$)) () Restituzioni di tutti gli elementi di un Multifield tranne il primo (rest$ <multifield-expression>) Esempio (rest$ (create$ a b c)) (b c) (rest$ (create$)) () 17

CLIPS: funzioni utili su Multifield Determinazione del numero di campi in un Multifield (length$ (create$ a b c d e f g)) 7 Cancellazione di Specifici Valori in un Multifield (delete-member$ (create$ a b a c) b a) (c) (delete-member$ (create$ a b c c b a) (create$ b a)) (a b c c) 18

CLIPS: funzioni utili su Stringhe String Functions (str-cat <expression>*) Concatenazione Stringhe (sym-cat <expression>*) Concatenazione Symbol (sub-string <integer-expression> <integer-expression> <string-expression>) (str-index <lexeme-expression> <lexeme-expression>) ritorna la posizione di una stringa in un'altra (eval <string-or-symbol-expression>) (build <string-or-symbol-expression>) (upcase <string-or-symbol-expression>) (lowcase <string-or-symbol-expression>) (str-compare <string-or-symbol-expression> <string-or-symbol-expression>) (str-length <string-or-symbol-expression>) 19

CLIPS I/O Logical Names: stdin, stdout, wclips, wdialog, wdisplay, werror, wwarning, wtrace. Common I/O Functions: open, close, printout, read, readline, format, rename, remove (open <file-name> <logical-name> [<mode>]) (close [<logical-name>]) (printout <logical-name> <expression>*) (read [<logical-name>]) (readline [<logical-name>]) (format <logical-name> <string-expression> <expression>*) (rename <old-file-name> <new-file-name>) (remove <file-name>) 20

I moduli CLIPS supporta lo sviluppo e l esecuzione modulare della Conoscenza. I moduli CLIPS, creati con il costrutto defmodule, permettono il raggruppamento di un insieme di costrutti in modo da controllare esplicitamente l accesso ai costrutti da altri moduli. Questo tipo di controllo è simile allo scope globale e locale utilizzato in linguaggi come il C o Ada. Restringendo l accesso ai costrutti deftemplate e defclass, i moduli possono funzionare come blackboards, permettendo solo a certi fatti e a certe istanze di essere visibili in altri moduli. I moduli sono usati anche da regole per fornire il controllo dell esecuzione. 21

I moduli: sintassi (defmodule <module-name> [<comment>] <port-spec>*) <port-spec> ::= (export <port-item>) (import <module-name> <port-item>) <port-item> ::=?ALL?NONE <port-construct>?all <port-construct>?none <port-construct> <construct-name>+ <port-construct> ::= deftemplate defclass defglobal deffunction defgeneric 22

I moduli: tipi di esportazione Export specifications Un modulo può esportare tutti i suoi costrutti visibili: export? ALL Un modulo può esportare tutti i suoi costrutti visibili di un tipo particolare: export name-of-the-construct?all Un modulo può esportare specifici costrutti visibili: export name-of-the-construct-type name-of-one-or-more-visible-constructs-of-the-specified-type (defmodule A (export?all)) (defmodule B (export deftemplate?all)) (defmodule C (export defglobal foo bar yak)) 23

I moduli: tipi di input Import Specification Un modulo può importare tutti i costrutti visibili di un altro modulo: import module-name?all Un modulo può importare tutti i costrutti visibili di un tipo particolare da un altro modulo: import module-name name-ofthe-construct-type?all Un modulo può importare specifici costrutti visibili di un altro modulo: import module-name name-of-the-construct-type name-of-one-or-more-visible-constructs-of-the-specified-type (defmodule A (import D?ALL)) (defmodule B (import D deftemplate?all)) (defmodule C (import D defglobal foo bar yak)) 24

I moduli e la visibilità dei fatti I fatti e le istanze appartengono ai moduli in cui sono definiti i corrispondenti deftemplate e defclass (e non ai moduli che li creano). I fatti e le istanze sono visibili nei moduli che importano i corrispondenti deftemplate o defclass. Questo permette una base di conoscenza partizionata in modo che le regole e gli altri costrutti possono vedere solo le istanze e i fatti cui sono interessati. Il deftemplate initial-fact deve essere esplicitamente importato dal modulo MAIN 25

I moduli e la visibilità dei fatti: Esempio (clear) (defmodule A (export deftemplate foo bar)) (deftemplate A::foo (slot x)) (deftemplate A::bar (slot y)) (deffacts A::info (foo (x 3)) (bar (y 4))) (defmodule B (import A deftemplate foo)) (reset) (facts A) f-1 (foo (x 3)) f-2 (bar (y 4)) For a total of 2 facts. (facts B) f-1 (foo (x 3)) Visibile in B perchè importato For a total of 1 fact. 26

I moduli: esempio definizione (defmodule FOO nome modulo che si sta definendo (import BAR?ALL) nome modulo da importare (import YAK deftemplate?all) (import GOZ defglobal x y z) (export defclass?all)) (defrule DETECTION::Find-Fault (sensor (name?name) (value bad)) => (assert (fault (name?name))) ) 27

I moduli Definito il modulo è possibile specificare i costrutti che ne faranno parte. I costrutti deffacts, deftemplate, defrule, deffunction, defgeneric, defclass, e definstances specificano il modulo in cui saranno presenti come parte del nome. Il modulo del costrutto defglobal è indicato specificando il nome del modulo dopo la parola chiave defglobal. (defrule FOO::Find-Fault (sensor (name?name) (value bad)) => (assert (fault (name?name))) ) (defglobal DETECTION?*count* = 0) 28

I moduli (clear) (defmodule A) (defmodule B) (defrule foo =>) (defrule A::bar =>) (list-defrules) bar For a total of 1 defrule. (set-current-module B) A (list-defrules) foo For a total of 1 defrule. 29

I moduli I comandi undefrule (cancellazione di una regola) e ppdefrule (visualizzazione testo di regola) richiedono il nome del costrutto sul quale operare. Con i moduli è possibile avere costrutti con lo stesso nome ma in moduli diversi. Module specifier: è la specifica esplicita del modulo di un nome (un symbol), module-name::. Per esempio MAIN::find-stuff, indica che il costrutto findstuff è nel modulo MAIN (il modulo standard del CLIPS). Un modulo può anche essere specificato implicitamente poiché esiste sempre un modulo corrente. Il modulo corrente viene cambiato ogni volta che si utilizza il costrutto defmodule oppure la funzione setcurrent-module 30

I moduli (clear) (defmodule A) (defglobal A?*x* = 0) (defmodule B) (defglobal B?*y* = 1) (ppdefglobal y) (defglobal B?*y* = 1) (ppdefglobal B::y) (defglobal B?*y* = 1) (ppdefglobal x) [PRNTUTIL1] Unable to find defglobal x (ppdefglobal A::x) (defglobal A?*x* = 0) 31

I moduli In generale i costrutti di un modulo non possono essere utilizzati da un altro modulo. Un costrutto si dice visibile in un modulo se il costrutto può essere utilizzato in quel modulo. Esempio: il modulo B vuole utilizzare il deftemplate foo definito nel modulo A, allora il modulo A deve esportare il deftemplate foo e il modulo B lo deve importare. (clear) (defmodule A) (deftemplate A::foo (slot x)) (defmodule B) (defrule B::bar (foo (x 3)) =>) [PRNTUTIL2] Syntax Error: Check appropriate syntax for defrule ERROR: (defrule B::bar (foo ( (clear) (defmodule A (export deftemplate foo)) (deftemplate A::foo (slot x)) (defmodule B (import A deftemplate foo)) (defrule B::bar (foo (x 3)) =>) 32

I moduli Ogni modulo ha la propria rete di pattern-matching per le sue regole e la propria agenda. Quando vien dato il comando run, viene eseguita l agenda del modulo attivo. L esecuzione delle regole continua finché non diventa attivo un altro modulo, non ci sono altre regole nell agenda, oppure viene eseguita la funzione return da una RHS di una regola. Quando un modulo attivo termina l esecuzione delle regole in agenda, il current focus viene rimosso dal focus stack e diventa attivo il successivo modulo sul focus stack. Prima che una regola venga eseguita, il modulo corrente diventa quello in cui la regola è definita. Il current focus può essere definito utilizzando il comando focus. 33

I moduli (clear) (defmodule MAIN (export?all)) (defrule MAIN::focus-example => (printout t "Firing rule in module MAIN." crlf) (focus A B)) (defmodule A (import MAIN deftemplate initial-fact)) (defrule A::example-rule => (printout t "Firing rule in module A." crlf)) (defmodule B (import MAIN deftemplate initial-fact)) (defrule B::example-rule => (printout t "Firing rule in module B." crlf)) (reset) (run) Firing rule in module MAIN. Firing rule in module A. Firing rule in module B. 34