Newer
Older
ai / lab4 / unificateur.py
@Andreas Jaggi Andreas Jaggi on 11 Apr 2006 9 KB Fixed chainageAvantAvecFiltrage algorithm
  1. #################################################################################
  2. #################################################################################
  3.  
  4. echec='ECHEC'
  5. ################################################################################
  6. ## retourne True si le symbole est une liste (cad: [])
  7. ## @param x le symbole a tester
  8. ## @ret True <=> x est une liste
  9. ################################################################################
  10. def testeListe(x):
  11. return type(x)==type([])
  12. ################################################################################
  13.  
  14. ################################################################################
  15. ## retourne True si le symbole est une liste vide (cad: [])
  16. ## @param x le symbole a tester
  17. ## @ret True <=> x est une liste vide
  18. ################################################################################
  19. def testeListeVide(x):
  20. return (type(x)==type([]) and len(x)==0)
  21. ################################################################################
  22.  
  23. ###############################################################################
  24. ##retourne True si le symbole est un atome (i.e.: ' ')
  25. ## @param x le symbole a tester
  26. ## @ret True <=> x est un atome
  27. #################################################################################
  28. ################################################################################
  29. def testeAtome(x):
  30. return type(x)==type('')
  31. ################################################################################
  32.  
  33. ################################################################################
  34. ## retourne le symbol x dans une liste
  35. ## @param x le symbole
  36. ## @ret [x]
  37. ################################################################################
  38. def retourneListe(x):
  39. return [x]
  40. ###############################################################################
  41.  
  42. ################################################################################
  43. ## retourne True si le symbole est une substitution
  44. ## @param x le symbole à tester
  45. ## @ret True <=> x est une substitution
  46. ################################################################################
  47. def testeSubstitution(x):
  48. return type(x)==type({})
  49. ################################################################################
  50.  
  51. ################################################################################
  52. ## retourne True si le symbole est une variable; i.e.:commence par ?
  53. ## @param x le symbole à tester
  54. ## @ret True <=> x est une variable
  55. ## '?toto' => True
  56. ## 'toto' => False
  57. ################################################################################
  58. def testeVariable(x):
  59. return (testeAtome(x) and x[0]=='?')
  60. ################################################################################
  61.  
  62.  
  63. ###############################################################################
  64. ## construit et retourne une substitution entre une variable et une expression
  65. ## @param variable la variable
  66. ## @param datum préposition sans variable
  67. ## @ret une substitution {variable:datum}
  68. ################################################################################
  69. def construitSubstitution(variable, datum):
  70. return {variable: datum}
  71. ################################################################################
  72.  
  73. ###############################################################################
  74. ## retourne la variable d'une substitution
  75. ## @param substitution la substitution
  76. ## @ret la variable de la substitution
  77. ################################################################################
  78. def retourneVariable(sub):
  79. return sub.keys()[0]
  80. ################################################################################
  81.  
  82. ###############################################################################
  83. ## retourne la valeur d'une substitution
  84. ## @param substitution la substitution
  85. ## @ret la valeur de la substitution
  86. ################################################################################
  87. def retourneValeur(sub):
  88. return sub.values()[0]
  89. ################################################################################
  90.  
  91. ###############################################################################
  92. ## retourne la substitution associé une variable
  93. ## @param variable la variable
  94. ## @param substituions la liste des substituion
  95. ## @ret la substitution associé à la varibale si elle existe, sinon retourn False
  96. ################################################################################
  97. def trouveSubstitution(variable, subs):
  98. if testeSubstitution(subs) and subs.has_key(variable):
  99. return {variable: subs[variable]}
  100. else:
  101. return False
  102. ################################################################################
  103. ########################..#######################################################
  104. ## verifie que la variable est dans les substitutions
  105. ## @param variable la variable
  106. ## @param substituions la liste des substituion
  107. ## @ret True <=> variable est dans les substitutions; else False
  108. ################################################################################
  109. def variableDansSubstitutions(variable, subs):
  110. return subs.has_key(variable)
  111. ################################################################################
  112.  
  113. ###############################################################################
  114. ## construit l'union de deux substitutions
  115. ## @param substitution1 la premiere substitution
  116. ## @param substitution2 la deuxieme substitution
  117. ## @ret substitution1 UNION substitution2; echec if substitution1 ou substitution2 ne sont pas des substitutions
  118. ###############################################################################
  119. def unionSubstitution(sub1,sub2):
  120. if testSubstitution(sub1) and testeSubstitution(sub2):
  121. sub1.update(sub2)
  122. return sub1
  123. else:
  124. return echec
  125. ###############################################################################
  126. ## retourne la proposition avec les variables remplacees par leurs valeurs
  127. ## @param pattern la proposition (contient des variables, atomes,... sous forme [' ',' ', ' '] OU ' ' ou ['[]'...])
  128. ## @param substitutions la liste des substitutions {a:b, c:d,...}
  129. ## @ret la proposition avec les variables remplacees par leur valeurs
  130. ################################################################################
  131. def substitueVariables(pattern , substitutions):
  132. ## test si on a pattern est un atome
  133. if testeAtome(pattern):
  134. if testeVariable(pattern) and substitutions.has_key(pattern):
  135. return substitueVariables(retourneValeur(trouveSubstitution(pattern,substitutions)),substitutions)
  136. else:
  137. for x in pattern[:]:
  138. pattern.append(substitueVariables(x , substitutions))
  139. pattern.pop(0)
  140. return pattern
  141. #####################################################################
  142.  
  143. ###############################################################################
  144. ## fait l'unification entre deux proposition passées en parametres
  145. ## ATTENTION Les propositions peuvent contenire des variables
  146. ## @param proposition1 proposition 1 avec variable
  147. ## @param proposition2 porposition 2 avec variable
  148. ## @ret substitution dans un dico is le filtrage reussi : {'?x':'a',...}, 'FAIL' sinon
  149. ###############################################################################
  150. def unifit(pat1, pat2):
  151. if testeAtome(pat1) or testeAtome(pat2):
  152. if not testeAtome(pat1):
  153. pat1, pat2 = pat2, pat1
  154.  
  155. if pat1 == pat2:
  156. return {}
  157. else:
  158. if testeVariable(pat1):
  159. if ::
  160. return echec
  161. else:
  162. return {pat1: pat2}
  163. else:
  164. if testeVariable(pat2):
  165. return {pat2: pat2}
  166. else:
  167. return echec
  168. else:
  169. f1 = pat1[0]
  170. t1 = pat1[1:]
  171. f2 = pat2[0]
  172. t2 = pat2[1:]
  173. z1 = unifit(f1, f2)
  174. if z1 == echec:
  175. return echec
  176. g1 = substitueVariables(t1, z1)
  177. g2 = substitueVariables(t2, z1)
  178. z2 = unifit(g1, g2)
  179. if z2 == echec:
  180. return echec
  181. return unionSubstitution(z1, z2)
  182. ###############################################################################
  183.  
  184. ################################################################################
  185. ## fait l'unification entre deux proposition passées en parametres
  186. ## ATTENTION Les propositions peuvent contenire des variables
  187. ## @param proposition1 proposition 1 avec variable
  188. ## @param proposition2 porposition 2 avec variable
  189. ## @param ênvironement un environement {'?x':'a',...}
  190. ## @ret substitution dans un dico is le filtrage reussi : {'?x':'a',...}, 'ECHEC' sinon
  191. ###############################################################################
  192. def unifcation(proposition1, proposition2, environement=None):
  193. if environement is None:
  194. environement={}
  195. if environement==echec:
  196. return echec
  197. else :
  198. proposition1 = substitueVariables(proposition1,environement)
  199. proposition2 = substitueVariables(proposition2,environement)
  200. return unionSubstitution(environement,unifit(proposition1, proposition2))
  201. ##############################################################################
  202. execfile("testSubstitueVariables.py")
  203. execfile("testUnifit.py")
  204. execfile("testUnificateur.py")