-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathunification.py
78 lines (60 loc) · 1.77 KB
/
unification.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
# Travaille TP1 AI
# Gastli Oussama
# Hanana Nour
# GL4
from expression import Expression
import ast
def unifier_atom(expr1:Expression,expr2:Expression):
if(expr2.isAtom()):
expr1,expr2=expr2,expr1
if(expr1==expr2):
return []
if(expr2.isVariable()):
expr1,expr2 = expr2,expr1
if(expr1.isVariable()):
if(expr1 in expr2):
return None
if (expr2.isAtom()):
return [[expr1.expression[0],expr2.expression[0]]]
if(expr2.isFunction()):
return [[expr1.expression[0],expr2.expression.__str__()]]
return None
def unifier(terms1:Expression,terms2:Expression):
if(terms1.isAtom() or terms2.isAtom()):
return unifier_atom(terms1,terms2)
F1,T1=terms1.separate()
F2,T2=terms2.separate()
Z1=unifier(F1,F2)
if(Z1==None):
return None
T1.substitute(Z1)
T2.substitute(Z1)
Z2=unifier(T1,T2)
if(Z2==None):
return None
Z2+=Z1
return Z2
# utilisée pour avoir un bon format d'affichage des fonctions
def functionToString(f):
if(isinstance(f,str)):
return f
else:
s=str(f[0])+"("
for k in range(1,len(f)):
s+=functionToString(f[k])+","
s=s[1:-1]
s+=")"
return s
# utilisée pour afficher les permutations de l'unification de façon lisible
# cette methode permet aussi de transformer la l'unification de ["?x","[...]"] à ["?x",[...]] si [...] represente une fonction
def beautifulResult(a):
if(a is None):
return "non unifiable"
elif (a==[]):
return "already unified"
s=""
for i in a:
if(i[1][0]=='['):
i[1]=ast.literal_eval(i[1])
s+="("+i[0]+"/"+functionToString(i[1])+") "
return s