################################################################################# ################################################################################# echec='ECHEC' ################################################################################ ## retourne True si le symbole est une liste (cad: []) ## @param x le symbole a tester ## @ret True <=> x est une liste ################################################################################ def testeListe(x): return type(x)==type([]) ################################################################################ ################################################################################ ## retourne True si le symbole est une liste vide (cad: []) ## @param x le symbole a tester ## @ret True <=> x est une liste vide ################################################################################ def testeListeVide(x): return (type(x)==type([]) and len(x)==0) ################################################################################ ############################################################################### ##retourne True si le symbole est un atome (i.e.: ' ') ## @param x le symbole a tester ## @ret True <=> x est un atome ################################################################################# ################################################################################ def testeAtome(x): return type(x)==type('') ################################################################################ ################################################################################ ## retourne le symbol x dans une liste ## @param x le symbole ## @ret [x] ################################################################################ def retourneListe(x): return [x] ############################################################################### ################################################################################ ## retourne True si le symbole est une substitution ## @param x le symbole à tester ## @ret True <=> x est une substitution ################################################################################ def testeSubstitution(x): return type(x)==type({}) ################################################################################ ################################################################################ ## retourne True si le symbole est une variable; i.e.:commence par ? ## @param x le symbole à tester ## @ret True <=> x est une variable ## '?toto' => True ## 'toto' => False ################################################################################ def testeVariable(x): return (testeAtome(x) and x[0]=='?') ################################################################################ ############################################################################### ## construit et retourne une substitution entre une variable et une expression ## @param variable la variable ## @param datum préposition sans variable ## @ret une substitution {variable:datum} ################################################################################ def construitSubstitution(variable, datum): return {variable: datum} ################################################################################ ############################################################################### ## retourne la variable d'une substitution ## @param substitution la substitution ## @ret la variable de la substitution ################################################################################ def retourneVariable(sub): return sub.keys()[0] ################################################################################ ############################################################################### ## retourne la valeur d'une substitution ## @param substitution la substitution ## @ret la valeur de la substitution ################################################################################ def retourneValeur(sub): return sub.values()[0] ################################################################################ ############################################################################### ## retourne la substitution associé une variable ## @param variable la variable ## @param substituions la liste des substituion ## @ret la substitution associé à la varibale si elle existe, sinon retourn False ################################################################################ def trouveSubstitution(variable, subs): if testeSubstitution(subs) and subs.has_key(variable): return {variable: subs[variable]} else: return False ################################################################################ ########################..####################################################### ## verifie que la variable est dans les substitutions ## @param variable la variable ## @param substituions la liste des substituion ## @ret True <=> variable est dans les substitutions; else False ################################################################################ def variableDansSubstitutions(variable, subs): return subs.has_key(variable) ################################################################################ ############################################################################### ## construit l'union de deux substitutions ## @param substitution1 la premiere substitution ## @param substitution2 la deuxieme substitution ## @ret substitution1 UNION substitution2; echec if substitution1 ou substitution2 ne sont pas des substitutions ############################################################################### def unionSubstitution(sub1,sub2): if testSubstitution(sub1) and testeSubstitution(sub2): sub1.update(sub2) return sub1 else: return echec ############################################################################### ## retourne la proposition avec les variables remplacees par leurs valeurs ## @param pattern la proposition (contient des variables, atomes,... sous forme [' ',' ', ' '] OU ' ' ou ['[]'...]) ## @param substitutions la liste des substitutions {a:b, c:d,...} ## @ret la proposition avec les variables remplacees par leur valeurs ################################################################################ def substitueVariables(pattern , substitutions): ## test si on a pattern est un atome if testeAtome(pattern): if testeVariable(pattern) and substitutions.has_key(pattern): return substitueVariables(retourneValeur(trouveSubstitution(pattern,substitutions)),substitutions) else: for x in pattern[:]: pattern.append(substitueVariables(x , substitutions)) pattern.pop(0) return pattern ##################################################################### ############################################################################### ## fait l'unification entre deux proposition passées en parametres ## ATTENTION Les propositions peuvent contenire des variables ## @param proposition1 proposition 1 avec variable ## @param proposition2 porposition 2 avec variable ## @ret substitution dans un dico is le filtrage reussi : {'?x':'a',...}, 'FAIL' sinon ############################################################################### def unifit(pat1, pat2): if testeAtome(pat1) or testeAtome(pat2): if not testeAtome(pat1): pat1, pat2 = pat2, pat1 if pat1 == pat2: return {} else: if testeVariable(pat1): if :: return echec else: return {pat1: pat2} else: if testeVariable(pat2): return {pat2: pat2} else: return echec else: f1 = pat1[0] t1 = pat1[1:] f2 = pat2[0] t2 = pat2[1:] z1 = unifit(f1, f2) if z1 == echec: return echec g1 = substitueVariables(t1, z1) g2 = substitueVariables(t2, z1) z2 = unifit(g1, g2) if z2 == echec: return echec return unionSubstitution(z1, z2) ############################################################################### ################################################################################ ## fait l'unification entre deux proposition passées en parametres ## ATTENTION Les propositions peuvent contenire des variables ## @param proposition1 proposition 1 avec variable ## @param proposition2 porposition 2 avec variable ## @param ênvironement un environement {'?x':'a',...} ## @ret substitution dans un dico is le filtrage reussi : {'?x':'a',...}, 'ECHEC' sinon ############################################################################### def unifcation(proposition1, proposition2, environement=None): if environement is None: environement={} if environement==echec: return echec else : proposition1 = substitueVariables(proposition1,environement) proposition2 = substitueVariables(proposition2,environement) return unionSubstitution(environement,unifit(proposition1, proposition2)) ############################################################################## execfile("testSubstitueVariables.py") execfile("testUnifit.py") execfile("testUnificateur.py")