Implementação de algumas das funções básicas do Prolog em Python, bom para entendimento de listas e dicionários.
Os fatos que devem existir no arquivo a ser lido, devem ser:
homem mulher progenitor
no estilo
homem(anakin).
mulher(padme).
progenitor(padme,luke).
progenitor(anakin,luke).
1 # Roberto Ritter de Oliveira Filho
2 # 30/11/2005
3 # Curitiba - Brasil
4 # Prolog em Python
5 #
6 #
7
8 global ListaHomem #cria a ListaHomem global
9 global ListaMulher #cria a ListaMulher global
10 global ListaProgenitor #cria a ListaProgenitor global
11 global ListaFuncoes #cria a ListaFuncoes global
12 ListaProgenitor={} #inicia dicionario ListaProgenitor
13 ListaFuncoes={'pai': 'func_pais(x,y,"homem")', \
14 'mae': 'func_pais(x,y,"mulher")',\
15 'filho':'func_filhos(x,y,"homem")',\
16 'filha':'func_filhos(x,y,"mulher")',\
17 'avoh':'func_avos(x,y,"homem")',\
18 'avom':'func_avos(x,y,"mulher")',\
19 'irmao':'func_irmaos(x,y,"homem")',\
20 'irma':'func_irmaos(x,y,"mulher")',\
21 'tio':'func_tios(x,y,"homem")',\
22 'tia':'func_tios(x,y,"mulher")',\
23 'sobrinho':'func_sobrinhos(x,y,"homem")',\
24 'sobrinha':'func_sobrinhos(x,y,"mulher")',\
25 'marido':'func_casal(x,y,"homem")',\
26 'esposa':'func_casal(x,y,"mulher")'} #inicia dicionario ListaFuncoes
27 ListaHomem=[] #inicia lista ListaHomem
28 ListaMulher=[] #inicia lista ListaMulher
29
30 def func_existe(nomedoarquivo):# funcao verifica se o arquivo existe
31 try:
32 global arquivolido
33 arquivo = open(nomedoarquivo,"r")
34 arquivolido=arquivo.readlines() #separa as linhas do arquivo
35 func_mensagem("PRO",nomedoarquivo)
36 return arquivolido
37 except:
38 func_mensagem('ER',nomedoarquivo)
39
40 def func_arquivo():# funcao do arquivo a ser lido
41 nomedoarquivo=raw_input("Digite o nome do Arquivo: ")
42 arquivolido=func_existe(nomedoarquivo)
43 if(arquivolido!=None):
44 func_estruturadosfatos() #inicia a leitura do arquivo e montagem dos fatos
45 func_prolog(arquivolido) #inicia o prolog com o arquivo lido como parâmetro
46
47 def func_mensagem(msn,oq): #retorno de mensagens do arquivo
48 if(msn=='ER'):
49 print "Erro! Arquivo '"+oq+"' não existe! "
50 sair=raw_input("'s' para sair e qualquer tecla para continuar: ")
51 if (sair.lower()!='s'):
52 func_arquivo()
53 if(msn=='PRO'):
54 print "Processando..."+oq
55 print ""
56 if(msn=='OK'):
57 print "Pronto!"+oq
58
59 def func_prolog(arquivolido): #funcao prolog
60 raw_input()
61 print """
62 ===================================
63 Consultas Disponiveis:
64 -----------------------------------
65 marido(marido,y).
66 esposa(esposa,y).
67 irmao(irma(o),irmao).
68 irma(irma(o),irma).
69 pai(pai,filho).
70 pai(x,y).
71 mae(mae,filho).
72 mae(x,y).
73 filho(filho,pai/mae).
74 filha(filha,pai/mae).
75 avoh(avohomem,neto(a)).
76 avom(avomulher,neto(a).
77 tio(tio,sobrinho(a)).
78 tia(tia,sobrinho(a).
79 sobrinho(sobrinho,tio(a)).
80 sobrinha(sobrinha,tio(a)).
81 homem(x).
82 mulher(x).
83 ====================================
84 """
85 pergunta=raw_input("Pergunta ('s' para sair) ?:- ")
86 if str(pergunta.lower())!='s': #verifica se a pergunta e <> de s e inicia o bloco abaixo
87 if ((pergunta.count("(")==1) and (pergunta.count(";")==1 or pergunta.count(".")==1) and (pergunta.count(")")==1)):
88 #a linha acima verifica se a pergunta esta no formato correto. eg. ().
89 # testa para ver se a pergunta esta montada corretamente
90 consulta=pergunta.split('(')[0] #retorna o primeiro elemento homem no caso de homem(x).
91 variavelx=pergunta.split('(')[1].split(')')[0] #retorna o elemento entre os ()
92 #pega o elemento x na pergunta homem(x).
93 if (variavelx=="x" and consulta=="homem"): #se for == x homem retornara a Lista de Homens. eg. homem(x).
94 print "\n".join(ListaHomem)
95 func_prolog(arquivolido)
96 if (variavelx=="x" and consulta=="mulher"): #se for == x e mulher retornara a Lista de Mulheres. eg. mulher(x).
97 print "\n".join(ListaMulher)
98 func_prolog(arquivolido)
99 if (variavelx!="x" and consulta in ListaFuncoes): #se for <> x e estiver no dicionario ListaFuncoes executa
100 y,x=func_separa(pergunta) #separa os valores de x,y na pergunta nonono(x,y). e retorna em filho e progenitor
101 eval(ListaFuncoes[consulta]) #executa funcao q esta no dicionario, com base na pergunta feita
102 else:
103 print "Pergunta não funciona!"
104 else:
105 print ("Falta colocar '.' ou '(' ou ')' ou ';' ")
106 func_prolog(arquivolido)
107
108 def func_separa(pergunta): #funcao para separar x e y
109 filho=pergunta.split("(")[1].split(")")[0].split(",")[1] #pega o elemento x de x,y
110 progenitor=pergunta.split("(")[1].split(")")[0].split(",")[0] #pega o elemento y de x,y
111 return filho,progenitor #retorna para a funcao
112
113 def func_sobrinhos(x,y,tipo): #verifica SOBRINHO ou SOBRINHA e TIO ou TIA e sobrinho e o tipo e do dicionario
114 Listas=func_listas(tipo) #chama funcao q retornara lista homem ou mulher
115 achei=0
116 if ((x in Listas)):
117 for i in range(len(ListaProgenitor)):
118 tmp2=ListaProgenitor.keys()[i]
119 if x in ListaProgenitor[tmp2]:
120 #print tmp2
121 paidosobrinho=tmp2
122 for i in range(len(ListaProgenitor)):
123 tmp=ListaProgenitor.keys()[i]
124 if ((y in ListaProgenitor[tmp]) and (paidosobrinho in ListaProgenitor[tmp]) and (paidosobrinho != y)):
125 achei=1
126 if(achei==1):
127 func_prolog_msg(True)
128 else:
129 func_prolog_msg(False)
130
131 def func_casal(x,y,tipo):
132 Listas=func_listas(tipo)
133 if x in Listas:
134 if (x in ListaProgenitor):
135 filho=ListaProgenitor[x]
136 for j in range(len(ListaProgenitor)):
137 if ((x != ListaProgenitor.keys()[j])):
138 if (filho == ListaProgenitor[ListaProgenitor.keys()[j]]):
139 y=ListaProgenitor.keys()[j]
140 print "Casal: "+x+" "+y
141 func_prolog_msg(True)
142
143 else:
144 func_prolog_msg(False)
145
146 else:
147 func_prolog_msg(False)
148
149
150
151
152 def func_tios(x,y,tipo): #verifica TIO ou TIA e sobrinho e o tipo e do dicionario
153 Listas=func_listas(tipo)#chama funcao q retornara lista homem ou mulher
154 achei=0
155 if ((x in Listas)):
156 for i in range(len(ListaProgenitor)):
157 tmp2=ListaProgenitor.keys()[i]
158 if y in ListaProgenitor[tmp2]:
159 #print tmp2
160 paidosobrinho=tmp2
161 for i in range(len(ListaProgenitor)):
162 tmp=ListaProgenitor.keys()[i]
163 if ((x in ListaProgenitor[tmp]) and (paidosobrinho in ListaProgenitor[tmp]) and (paidosobrinho != x)):
164 achei=1
165 if(achei==1):
166 func_prolog_msg(True)
167 else:
168 func_prolog_msg(False)
169
170 def func_avos(z,x,tipo): #verifica AVOH ou AVOM e netos e o tipo e do dicionario
171 Listas=func_listas(tipo)#chama funcao q retornara lista homem ou mulher
172 if ((z in Listas) and (z in ListaProgenitor)):
173 for i in range(len(ListaProgenitor[z])):
174 if ListaProgenitor[z][i] in ListaProgenitor:
175 if x in ListaProgenitor[ListaProgenitor[z][i]]:
176 func_prolog_msg(True)
177 else:
178 func_prolog_msg(False)
179 else:
180 func_prolog_msg(False)
181
182 def func_irmaos(x,y,tipo):#verifica IRMAO ou IRMA, irmaos ou e o tipo e do dicionario
183 Listas=func_listas(tipo)#chama funcao q retornara lista homem ou mulher
184 if ((y in Listas)):
185 for i in range(len(ListaProgenitor)):
186 tmp=ListaProgenitor.keys()[i]
187 if x in ListaProgenitor[tmp] and y in ListaProgenitor[tmp]:
188 func_prolog_msg(True)
189 else:
190 None
191
192 else:
193 func_prolog_msg(False)
194
195 def func_filhos(x,y,tipo): #verifica FILHO ou FILHA e pai ou mae e o tipo e do dicionario
196 Listas=func_listas(tipo)#chama funcao q retornara lista homem ou mulher
197 if ((x in Listas) and (y in ListaProgenitor)):
198 if x in ListaProgenitor[y]:
199 func_prolog_msg(True)
200 else:
201 func_prolog_msg(False)
202 else:
203 func_prolog_msg(False)
204
205 def func_pais(x,y,tipo): #verifica PAI ou MAE e filhos
206 Listas=func_listas(tipo)#chama funcao q retornara lista homem ou mulher
207 if ((x!='x')and (y!='y')):
208 if ((x in Listas) and (x in ListaProgenitor)):
209 if y in ListaProgenitor[x]:
210 func_prolog_msg(True)
211 else:
212 func_prolog_msg(False)
213 elif ((x=='x') and (y=='y')):
214 for i in ListaProgenitor:
215 if i in Listas:
216 print 'Pai ou Mãe : '+i
217 for j in ListaProgenitor[i]:
218 print 'Filho(a) : '+j
219 func_prolog_msg(True)
220 elif ((x!='x') and (y=='y')):
221 if ((x in Listas) and (x in ListaProgenitor)):
222 print 'Pai ou Mãe: '+x
223 for j in ListaProgenitor[x]:
224 print 'Filho(a) : '+j
225 func_prolog_msg(True)
226 else:
227 func_prolog_msg(False)
228
229 else:
230 func_prolog_msg(False)
231
232 def func_listas(tipo): #le do dicionario o parametro tipo e retorna lista correta
233 Listas=[]
234 if (tipo=='homem'):
235 Listas=ListaHomem
236 else:
237 Listas=ListaMulher
238 return Listas
239
240 def func_estruturadosfatos(): #monta as Listas Homem e Mulher e o Dicionario ListaProgenitor
241 for i in range(len(arquivolido)):
242 if len(arquivolido[i])>4:
243 verifica=arquivolido[i].split('(')[0]
244 variavelx=arquivolido[i].split("(")[1].split(")")[0]
245 if (verifica=="homem"):
246 ListaHomem.append(variavelx)
247 if (verifica=="mulher"):
248 ListaMulher.append(variavelx)
249 if (verifica=="progenitor"):
250 filho=arquivolido[i].split("(")[1].split(")")[0].split(",")[1]
251 pai=arquivolido[i].split("(")[1].split(")")[0].split(",")[0]
252 if pai in ListaProgenitor:
253 ListaProgenitor[pai].append(filho)
254 else:
255 ListaProgenitor[pai]=[filho]
256
257 def func_prolog_msg(msg): #retorna mensagens do prolog
258 if msg==True:
259 print "Sim"
260 if msg==False:
261 print "Nao"
262 func_prolog(arquivolido)
263
264 def main():
265 print "=======PROLOG EM PYTHON======="
266 func_arquivo()
267
268 if __name__ == "__main__":
269 main()