associação pythonbrasil[11] django zope/plone planet Início Logado como (Entrar)

PrologPython

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()