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

Você não tem permissão para executar esta ação.

Excluir mensagem

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