Representation de Structures de Connaissance

Transcription

Representation de Structures de Connaissance
Systèmes Intelligents : Raisonnement et Reconnaissance
James L. Crowley
Deuxième Année ENSIMAG
Séance 7
Deuxième Sémestre 2004/2005
23 mars 2005
Représentation Structurée de la Connaissance
Techniques Avancés de Programmation en CLIPS ....... 3
Evaluation de fonctions par "eval".......................................... 3
Definitions dynamique avec a fonction "build"......................... 3
Protocole de Communication avec "eval" et "build".................. 5
exemple d'execution d'interpret...........................................7
Regle de communication par message....................................8
Inclusion des fonctions extern dans CLIPS............................... 9
Applications de la Connaissance Structurée...............13
Frames ................................................................................ 13
Scripts :............................................................................... 16
Exemples des scripts : ........................................................... 17
Réseau Sémantique :.............................................................. 20
Conceptuel Dépendance......................................................... 20
Techniques Avancés de Programmation en CLIPS
Evaluation de fonctions par "eval"
(eval <string>)
ou
(eval <symbol_expression>)
La fonction "eval" permet d'interprèter une expression comme si il a été
tapé par l'utilisateur.
L'expression peut être une chaine de caractères ou des symboles.
exemple :
CLIPS> (eval "(+ 3 4)")
7
CLIPS> (eval "(create$ a b c)")
(a b c)
CLIPS>
;;
;; exemple de eval avec un fonction.
;;
CLIPS> (deffunction f (?a)
(printout t "f(" ?a ") = " (random) crlf))
CLIPS> (f 1)
f(1) = 16838
CLIPS> (eval "(f 2)")
f(2) = 5758
CLIPS>
Eval n'execute pas un fonction de definitions (ex.: defrule, deftemplate, declasse...)
Pour les definitions, il faut utiliser "build".
Definitions dynamique avec a fonction "build"
(build <string>)
ou
(build <symbol_expression>)
La fonction build permet l'interpretation d'une chaine de caractere
contenant une definition CLIPS , (ex.: defrule, deftemplate, declasse...).
build retourne TRUE si la definition a marché et FALSE s'il y a eu une erreur.
;;
;;
;;
exemple de build
CLIPS> (build "(deffunction g (?a) (return ?a)")
TRUE
CLIPS> (g whiz)
whiz
;; qu'est ce passe si on fait ceci?
CLIPS> g(whiz)
g
Une Probleme : les guillements dans une chaine de caractères
Il faut les preceder les guillement par \
CLIPS> (build "(deffunction f (?a)
(printout t \"f(\" ?a \") = \" (random) crlf )"
)
TRUE
CLIPS>(f 1)
f(1) = 31051
CLIPS>(eval "(f 1)")
Build permet des règles en CLIPS de construire d'autre règles.
exemple :
;;
;; build d'un regle
;;
(defrule regle-construit
(a b c)
=>
(printout " (a b c) existe " crlf)
)
peut etre construit par :
(build "(defrule regle-construit (a b c)
=> (printout t \" (a b c) existe \" crlf) )"
)
Le chaine de caractère peut être composer par un ensemble de règles.
Protocole de Communication avec "eval" et "build"
Avec "build" et "eval", Deux processus CLIPS communicant par Socket peut se
definir leur protocole de communication dynamiquement.
C.-a-d. Un processus CLIPS peut programmer un autre.
Processus A programme processus B par message
(deffunction foo ...)
Module A
Module B
Processus B reception le nouvelle fonction "foo".
Module A
Module B
(build (deffunction foo ...))
Processus A peut ensuite executer fonction foo par message a Procesus B
(foo args)
Module A
Module B
Processus B interpret the message ...
Module A
Module B
( eval (foo args))
.... et retourne un resultat.
( eval (foo args))
Module A
Module B
Si un message commence par ""(def..." on appel "build" sinon "eval".
Soit les fonction d'envoie et reception "send-mess" et "get-mess".
(deffunction interpret ()
(bind ?mess (get-mess))
(bind ?sub (sub-string 2 4 ?mess))
(if (eq ?sub "def")
then (build ?mess)
else (eval ?mess))
)
On peut verifier que la message est a "interpreter" en testant
si le premiere caractere est un "(".
(deffunction interpret ()
(bind ?mess (get-mess))
(if (neq (sub-string 1 1 ?mess) "(")
then (printout t "message : " ?mess crlf)
(return TRUE)
else
(bind ?sub (sub-string 2 4 ?mess))
(if (eq ?sub "def")
then (build ?mess)
else (eval ?mess))
)
)
On peut simuler send-mess et get-mess avec printout et readline.
;;
;;
send-mess permet l'envoie d'une message par "socket"
on simule send-mess ici avec printout
(deffunction send_mess (?message) (printout ?message))
;; get-mess recoit une message par socket.
;; On simule get-mess avec readline
(deffunction get-mess ()
(printout t "Message? ")
(return (readline)))
exemple :
CLIPS> (send-mess "This is a test")
This is a test
CLIPS> (get-mess)
Message? this is a test
"this is a test"
CLIPS>
;; interrogation
;; reponse
On peut interpreter les message par la fonction "interpret".
(deffunction interpret ()
(eval (get-mess))
)
Exemple :
CLIPS> (deffunction send-mess (?message) (printout t ?message
crlf))
CLIPS> (deffunction get-mess () (printout t "Message? ") (return
(readline)))
)
CLIPS> (deffunction interpret () (eval (get-mess)))
CLIPS> (interpret)
Message? (assert (a b c))
<Fact-0>
CLIPS> (facts)
f-0
(a b c)
For a total of 1 fact.
CLIPS>
exemple d'execution d'interpret
CLIPS> (interpret)
Message? this is a test
message : this is a test
CLIPS> (interpret)
Message? (assert (this is a test))
<Fact-0>
CLIPS> (facts)
f-0
(this is a test)
For a total of 1 fact.
CLIPS> (interpret)
Message? (deftemplate A (slot b) (slot c))
TRUE
CLIPS> (interpret)
Message? (assert (A (b "test")))
<Fact-1>
CLIPS> (facts)
f-0
(this is a test)
f-1
(A (b "test") (c nil))
For a total of 2 facts.
CLIPS>
Regle de communication par message
On peut avoir une regle qui recoit et interpret les messages :
(defrule get-message
?go <- (go)
(not (stop))
=>
(retract ?go) (assert (go))
(send-mess (interpret))
)
CLIPS> (run)
Message? this is a test
message : this is a test
TRUE
Message? (assert (this is a test))
<Fact-19>
Message? (deffunction stop () (assert (stop)))
TRUE
Message? (deffunction f1 (?x ?y) (+ ?x ?y))
TRUE
Message? (f1 1 2)
3
Message? (deffunction f2 (?x ?y) (* ?x ?y))
TRUE
Message? (f2 2 3)
6
Message? (stop)
<Fact-10>
CLIPS>
Inclusion des fonctions extern dans CLIPS
CLIPS est un système ouvert ("Open System" en anglais)
Il est écrit en C et distribué avec sa code source.
Ceci rend facil l'inclusion de fonctions extern, écrit par l'utilisateur,
dans l'environnement de l'interpret.
L'extension de CLIPS est decrit dans le manual :
Vol 2 : Advanced Programming Guide
Pour ajouter une fonction extern il faut
1) compiler le fonction.
2) Ajouter une declaration de la fonction et ses parametres dans main.c
3) Inclure son code objet (fonction.o) dans le "make-file"
et refaire le "make".
Les fonctions sont declarés avec DefineFunction ou DefineFunction2
int
DefineFunction(functionName,functionType,
functionPointer,actualFunctionName);
int
DefineFunction2(functionName,functionType,
functionPointer,actualFunctionName,
functionRestrictions);
char *functionName, functionType, *actualFunctionName;
int
(*functionPointer)();
char
*functionRestrictions
Exemple des declarations :
UserFunctions()
{
/* Declare your C functions if necessary. */
extern double ma_fonc();
extern VOID *dummy();
/* Call DefineFunction to register user-defined functions. */
DefineFunction("fonc",'d',ma_fonc,"ma_fonc");
}
1
Les paramètres de DefineFonction sont
1) La nom à utiliser dans l'interpreter CLIPS.
Pas forcement le meme que le nom du fonction ecrite en "c".
2) Le type de resultat rendu par le fonction. (ici un double).
3) L'adresse de la fonction.
4) Une representation en chaine de caractere (STRING) de l'adresse de la fonction.
Il est possible de declarer la fonction avec ses arguments en utilisant
"DefineFunction2".
int
char
int
char
DefineFunction2(functionName,functionType,
functionPointer,actualFunctionName,
functionRestrictions);
*functionName, functionType, *actualFunctionName;
(*functionPointer)();
*functionRestrictions
Les premieres 4 arguments sont les memes que DefineFonction.
Le cinquième est une chaine de caracteres decrivant les arguments.
Cette chaine a le format :
<min-args> <max-args> [<default-type> <types>*]
Explications : <min-args> <max-args> : des entiers ou "*"
Exemples :
La communication entre deux processus CLIPS sur deux machines
differents peut etre assurer par les procedures en C : transmet() et recoit().
La procedure "transmet()" permet de transmetre une chaine "message".
On veut que sa nom en CLIPS soit "send_mess".
Il return un code d'erreur ou NULL si le message est transmit.
La procedure "recoit()" permet de recoit une chaine "message".
On veut que sa nom en CLIPS soit "get_mess".
Il return une chaine ou une code d'erreur.
int transmet(char * message; )
{...
}
char *
{...
}
recoit()
Dans main.c :
DefineFunction2(send-mess, 'i', transmet, "transmet", "11s");
DefineFunction(get-mess, 's', recoit, "recoit");
Les codes des types de retour sont :
Return Code Return Type Expected
a
b
c
d
f
i
j
k
l
m
n
o
s
u
v
w
x
External Address
Boolean
Character
Double Precision Float
Single Precision Float
Integer
Unknown Data Type (Symbol, String, or Instance Name Expected)
Unknown Data Type (Symbol or String Expected)
Long Integer
Multifield
Unknown Data Type (Integer or Float Expected)
Instance Name
String
Unknown Data Type (Any Type Expected)
Void—No Return Value
Symbol
Instance Address
Des codes de types pour les paramètres sont.
Type Code
Allowed Types
a
d
e
f
g
h
i
j
k
l
m
External Address
Float
Instance Address, Instance Name, or Symbol
Float
Integer, Float, or Symbol
Instance Address, Instance Name, Fact Address, Integer, or Symbol
Integer
Symbol, String, or Instance Name
Symbol or String
Integer
Multifield
n
o
p
q
s
u
w
x
y
z
Integer or Float
Instance Name
Instance Name or Symbol
Symbol, String, or Multifield
String
Any Data Type
Symbol
Instance Address
Fact Address
Fact address, Integer, or Symbol
Applications de la Connaissance Structurée
L'expression de la connaissance déclarative par structure de schéma a plusieurs
applications. Trois applications classique sont les Frames, les Scripts et les Réseaux
Sémantiques.
Frames :
Un assemblage des objets pour décrire une scène.
Script :
Un assemblage des objets pour décrire une séquence des événements
Réseau Sémantique : Un assemblage des objets pour décrire le sens sémantique d'un
texte.
Frames
(Table-Scene (is-a scene)
(Surface [Table])
(Objets [Cube])
)
(Cube (is-a entity)
(front [P1])
(side [P2])
(top [p3])
)
(rect (is-a polygon)
(name [p1]
(edges l1, l2, l3 l4)
)
Les "Frames" était proposée par Minsky pour représenter les scènes. Depuis les
concepts à été généralisé, et maintenant on trouve le terme frame utilisé en
synonyme avec "schéma".
Un frame est une description d'un contexte composé d'une collection de rôles et
relations. Ceci donne une description “explicite” du contexte qui peut servir de
guider l’interprétation s'une scène, d’une situation ou d'une histoire.
La structure d’une frame permet de faire les inférences par raisonnement par
défaut.
Exemple d'une Frame pour un Vol Air France :
LHR
from
AF357
to
LYS
Ceci correspond à des objets CLIPS :
(defclass AIRPORT (is-a USER)
(role concrete)
(slot code (create-accessor read-write))
(slot AD-name (create-accessor read-write))
(slot city (create-accessor read-write))
(slot country (create-accessor read-write))
)
(make-instance [LYS] of AIRPORT (code LYS)
(AD-name Satolas) (city Lyon) (country France))
(make-instance [LHR] of AIRPORT (code LHR)
(AD-name Heathrow) (city London) (country Britain))
(defclass FLIGHT (is-a USER)
(role concrete)
(slot code (type SYMBOL)(create-accessor read-write))
(slot from (type INSTANCE)(create-accessor read-write))
(slot to (type INSTANCE)(create-accessor read-write))
(message-handler from-city)
(message-handler to-city)
)
(defmessage-handler FLIGHT from-city()
(send ?self:from get-city))
(defmessage-handler FLIGHT to-city()
(send ?self:to get-city))
(make-instance [AF357] of FLIGHT
(from [LHR]) (to [LYS])(code AF357)
)
On peut ensuite poser des questions telles que “d'où vient le vol AF 357”
CLIPS> (send [AF357] from-city)
London
CLIPS> (send [AF357] to-city)
Lyon
Exemple : Frame pour un person
Pour l'exemple qui suit, on aura besoins d'un Frame pour person.
(defclass PERSON (is-a USER)
(role concrete) (pattern-match reactive)
(slot last-name (create-accessor read-write))
(slot first-name (create-accessor read-write))
(slot location (create-accessor read-write))
(message-handler who-is)
(message-handler where-is)
)
(defmessage-handler PERSON who-is ()
(str-cat ?self:first-name " " ?self:last-name)
)
(defmessage-handler PERSON where-is ()
(if (neq ?self:location nil)
then (send ?self:location where-is)
else (printout t "I dont know where ?self:first-name is"
crlf))
)
(defmessage-handler PERSON what-city-is ()
(if (neq ?self:location nil)
then (send ?self:location get-city)
else (printout t "I dont know where ?self:first-name is"
CRLF))
)
(make-instance [Jim] of PERSON
(last-name Crowley) (first-name James)
)
(defclass PLACE (is-a USER)
(role concrete) (pattern-match reactive)
(slot place-name (create-accessor read-write))
(slot city (create-accessor read-write))
(slot country (create-accessor read-write))
(message-handler where-is)
)
(defmessage-handler PLACE where-is ()
(return ?self:place-name)
)
(make-instance [Home] of PLACE
(place-name chez-moi)
(city Meylan)
(country France)
)
(send [Jim] where-is)
(send [Jim] put-location [Home])
(send [Jim] where-is)
Scripts :
Un Script est une structure de schémas utilisés pour décrire une séquence
d’événements. Un script est une forme de connaissance déclarative qui peut servir
1) communiquer, comprendre et raisonner sur une histoire
2) comprendre ou raisonner sur une situation ou une séquence d'événements
3) raisonner sur les actions
4) planifier les actions
Un script est composé de :
1) Une scène (en lieu et ses composants).
2) Des "props" (Les objets manipulés dans le script).
3) Les acteurs
4) Des actions
6) Les événements : Un changement de situation ou Contexte
7) Les contextes. Une association de rôles et relations.
Le script est une structure de contextes. Dans chaque contexte, un ou plusieurs
acteurs font les actions. Les acteurs agissent dans les lieus de la scène avec les props.
Les contextes peuvent être organisé en séquence, arbre ou réseau.
Le script aide à l’interprétation et à la communication par fournissant les éléments
primitifs est les méthodes de leur reconnaissance.
En outre, une scripte permet de prédire les actions et événements possibles et les
nouveaux contextes qu’on découle.
Exemples des scripts :
1) Manger dans une bonne restaurant française
Scène :
Acteurs :
Props :
La (les) salle(s), l'entrée, les tables (comme lieu), la cuisine
Le maître d’Hôtel, Le serveur, la "bus-boy", les clients
le menu la table (comme objet), les chaises, les couteaux, fourchettes et
cuillers, la (les) verre(s)
Actions:
Entrer, S'asseoir, lire le menu, commander, manger, boire, demander
l'addition, payer, partir.
Contextes:
Les phases du repas (arriver, s'installer, commander, manger, payer)
La scène, les acteurs, le props, les actions, les contextes sont tous représenté par les
schéma.
2) Achat d’une boisson au distributeur automatique
Scène :
Props:
Acteur :
actions :
devant la machine
La machine, les pieces de monnaie, la boisson, le gobelet,
acheteur
1) Sortir tes pieces de monnaie
2) Payer
3) Sélectionner la boisson et les options (sucre, crème, etc.)
4) Recouper la boisson et le monnaie
Exemple d’un script hiérarchique
Une scripte est typiquement une "hiérarchie" des contextes.
Les contextes sont composés d'actions. Chaque action est aussi une scripte.
Le résultat est un arbre "Et-ou".
Pour chaque action il y a une séquence (ou réseau) de contextes
Pour chaque contexte il y a une liste d'actions possible
Exemple : Aller à Paris
Niveau 1 : action : Aller à Paris
Contextes : Aller en train, aller en avion, aller en voiture, aller en auto-stop
Niveau 1 : Contexte : Aller en train:
Actions : aller a la gare, acheter un billet, voyager, arriver
Niveau 2 : Action: aller au gare
Contextes : aller en bus, aller en taxi, aller en automobile
Niveau 2 : Context: aller en bus,
actions : Aller à l’arrêt bus, attendre, monter sur le bus, aller, sortir à la gare
Travel to Paris
Travel-by-Train
Go to Gare
Bus
Go to Bus
Taxi
Wait
Buy Ticket
Automobile
Ride Bus
Travel-by-Plane
Travel
Arrive
Travel by Automobile
(defclass SCRIPT (is-a USER)
(role concrete) (pattern-match reactive)
(part-of (create-accessor read-write))
(slot scene (create-accessor read-write))
(slot actor (create-accessor read-write))
(multislot props (create-accessor read-write))
(multislot actions (create-accessor read-write))
)
(defclass TRAVEL-SCRIPT (is-a SCRIPT)
(role concrete) (pattern-match reactive)
(slot mode (create-accessor read-write))
(slot provenance (create-accessor read-write))
(slot destination (create-accessor read-write))
(multislot possible-travel-modes (create-accessor readwrite))
)
(make-instance [Travel-to-Paris] of TRAVEL-SCRIPT
(actor [Jim])
(destination [Paris])
(possible-travel-modes [Travel-by-Train] [Travel-byplane] [Travel-by-auto])
)
(defrule find-actor
?action <- (object (is-a TRAVEL-SCRIPT )
(actor ?a)
(provenance nil))
=>
(send ?action put-provenance (send ?a what-city-is))
)
(make-instance Travel-by-Train of TRAVEL-SCRIPT
(part-of [Travel-to-Paris]
(props [Ticket] [Train])
(actions
[Go-to-Station] [Buy-Ticket] [Find-Train]
[Find-seat] [Travel])
)
(make-instance Go-to-Station of TRAVEL-SCRIPT )
(part-of [Travel-by-Train]
(provenance [Home])
(destination [Station])
(possible-travel-modes [Taxi] [Auto] [Bus] [Walk])
)
(make-instance [Paris] of PLACE
(place-name Paris)
(city Paris)
(country France)
)
Réseau Sémantique :
Comment représenter la “sémantique” d’une phrase ou d'une scène?
Les réseaux sémantiques utilisent les schémas pour fournir une expression
symbolique de la "sens" des mots. Ils sont utilisés pour les systèmes de traduction
automatique.
La sémantique des mots est exprimée par référence à une hiérarchie de concepts
abstrait. L'approche des "Réseaux Sémantiques" est de définir un ensemble de
prédicats “primitifs”. Les mots sont définis comme une conjonction de ses
primitifs.
Exemple :
∀ x (Father(x) →
parent(x) ∧ mâle(x) )
Dans une base de connaissance, on remplace chaque mot par sa définition.
Cette idée a inspiré plusieurs efforts de définir un vocabulaire de concepts
“de base” pour la langue naturelle.
Conceptuel Dépendance
Dans les années 70, Shanks a proposé une théorie qui s’appelle :
“Conceptual Dependance” Le CD est un ensemble de “primitives” réduit. Par
exemple, il y a trois primitifs basés sur le concept de transfert.
ATRANS : Transfère Abstrait. (Tel que transfère de la possession d’une chose)
PTRANS : Transfert Physique
MTRANS : Transfert Mental.
Il y aussi d’autres primitifs tels que :
CONC : Conceptualise - construire une description abstrait
MBUILD : Build Mental - Inférence
MOVE : Mouvement d’une partie du corps
GRASP : Saisir
INGEST : Ingérer
EXPEL : Inverse d’ingérer
Les plus part des verbes peut être exprimé en termes de ces primitifs.
Il s’agit d’une branche d'ontologie : l'Étude de concept et catégories.
Exerci