Escolar Documentos
Profissional Documentos
Cultura Documentos
integer( X ) X um inteiro
atom( X ) X um tomo atomic( X ) X um inteiro ou um tomo
% aplana( Xs, Ys ) Ys uma lista com os elementos de Xs (fechada) aplana( Xs, Ys ) aplana( Xs, [], Ys ). aplana( [X|Xs], S, Ys ) lista( X ), aplana( X, [Xs| S], Ys ). aplana( [X|Xs], S, [X|Ys] ) atomic( X ), X \=[], aplana( Xs, S, Ys ). aplana( [], [X|S], Ys ) aplana( X, S, Ys ). aplana( [], [], [] ). lista( [X|Xs] ).
este programa aplana uma lista usando uma stack implementada como uma lista manipulada por unificao a estrutura construda top-down
Prolog - 1
Predicados de manipulao da estrutura functor( Termo, Functor, Aridade ) o functor principal de Termo Functor com aridade Aridade arg( N, Termo, Arg ) Arg o Nsimo argumento de Termo Termo =.. Lista se a cabea da lista contm o functor do termo e o resto da lista os seus argumentos
Prolog - 2
Anlise de subtermos
% subtermo( Sub, Termo ) Sub um subtermo do termo fechado Termo subtermo( Termo, Termo ). subtermo( Sub, Termo ) functor( Term, F, N ), N>0, subtermo( N, Sub, Termo ). subtermo( N, Sub, Termo ) N>1, N1 is N-1, subtermo( N1, Sub, Termo ).
Prolog - 3
Predicados meta-lgicos
Predicados de tipo meta-lgicos var( X ) X uma varivel nonvar( X ) X no uma varivel X == Y X e Y so o mesmo termo (a mesma varivel, etc...) X \== Y X e Y no so o mesmo termo
soma( X, Y, Z ) nonvar( X ), nonvar( Y ), Z is X+Y. soma( X, Y, Z ) nonvar( X ), nonvar( Z ), Y is Z-X. soma( X, Y, Z ) nonvar( Y ), nonvar( Z ), X is Z-Y.
Prolog - 4
Predicados meta-lgicos
estes predicados so meta-lgicos porque referir-se ao nome de uma varivel est fora da lgica de primeira ordem
no se pode representar este predicado com uma tabela de todos os seus factos (so em nmero infinito) permitir implementar predicados bidireccionais custa de predicados de sistema (unidireccionais) escolher a melhor ordem para os golos, conforme a instanciao dos argumentos (em especial para garantir o correcto funcionamento da negao e dos predicados de sistema) para evitar instanciaes indesejadas nos predicados de anlise de termos
Prolog - 5
interesse:
Termos fechados
% fechado( Termo ) Termo est completamente instanciado fechado( Termo ) nonvar( Termo ), atomic( Termo ). fechado( Termo ) nonvar( Termo ), functor( Termo, F, N ), N>0, fechado( N, Termo ). fechado( N, Termo ) N>0, arg( N, Termo, Arg ), fechado( Arg ), N1 is N-1, fechado( N1, Termo ). fechado( 0, Termo )
Prolog - 6
Entrada/sada
predicados extra-lgicos produzem efeitos laterais, para alm de sucederem, normalmente s uma vez, i.e. em retrocesso falham nvel do termo
read( X ) l um termo do canal de entrada (at um ponto final) e unifica-o com X, sucedendo ou falhando em conformidade write( X ) escreve o termo X no canal de sada 'Isto um tomo que inclui espaos' "Isto " uma notao ao jeito das strings, equivalente lista de inteiros [73, 115, 116, 111, 32] que contm os cdigos ASCII dos caracteres na string name( X, Y ) converte o nome de constante X para a cadeia de caracteres Y correspondente e vice-versa display( X ) escreve o termo X em notao prefixa
Prolog - 7
Entrada/sada
nvel do carcter
put( N ) coloca o carcter de cdigo ASCII N no canal de sada get0( N ) N o cdigo ASCII do carcter seguinte no canal de entrada get( N ) N o cdigo ASCII do carcter no branco seguinte no canal de entrada % minsculas % maisculas % underscore % espao % ponto
Prolog - 8
caracter( C ) 97 =< C, C=< 122. caracter( C ) 65 =< C, C=< 90. caracter( 95 ). separador( 32 ). terminador( 46 ).
Lista de palavras
le_lista_palavras( Ws ) get( C ), le_lista_palavras( C, Ws ). le_lista_palavras( C, [W | Ws] ) caracter( C ), le_palavra( C, W, C1 ), le_lista_palavras( C1, Ws ). le_lista_palavras( C, Ws ) separador( C ), get( C1 ), le_lista_palavras( C1, Ws ). le_lista_palavras( C, [] ) terminador( C ). le_palavra( C, W, C1 ) caracteres( C, Cs, C1 ), name( W, Cs ). caracteres( C, [C|Cs], C0 ) caracter( C ), !, get0( C1 ), caracteres( C1, Cs, C0 ). caracteres( C, [], C ) not caracter( C ).
Prolog - 9
Ficheiros
inicialmente, h um canal aberto para entrada e para sada chamado user e que est ligado ao terminal entrada
seeing( F ) F unificado com o nome do ficheiro no canal de entrada corrente seen fecha o canal de entrada corrente
Prolog - 10
Ficheiros
sada
Prolog - 11
Acesso ao programa
listing, listing( Pred ) escreve no cran as clusulas do programa, ou s do predicado clause( Head, Body ) percorre, em retrocesso, as clusulas do programa que unificam com Head, o qual tem que estar instanciado assert( Clausula ) adiciona a clusula no fim da definio do respectivo predicado
Prolog - 12
Acesso ao programa
consult( F ) l o programa no ficheiro F, fazendo o assert das clusulas e executando as directivas que encontrar ( G )
reconsult( F ) semelhante a consult mas faz primeiro retract a todos os predicados para os quais vai fazer assert (substitui, em vez de adicionar)
Prolog - 13
Funes de memorizao
pode-se usar a capacidade de manipular o programa para gravar resultados de computaes parciais, para reutilizao em fases subsequentes ideia geral: uma pilha de altura N passa-se para B passando a pilha de altura N-1 para o poste auxiliar C, o disco N para B e a pilha de C para B; esta segunda passagem igual primeira, a menos de instanciaes, e pode ser resolvida pelo lema entretanto memorizado [efeito lateral para alm da Programao em Lgica] bottom-up testa_hanoi s instancia os Postes no fim para gravar solues gerais nos lemas
Prolog - 14
Torres de Hanoi
% hanoi( N, A, B, C, Moves ) Moves a sequncia de passos para transferir N discos do poste A para o B usando C, segundo as regras do puzzle Torre de Hanoi hanoi( 1, A, B, C, [A to B] ). hanoi( N, A, B, C, Moves ) N>1, N1 is N-1, lema( hanoi(N1,A,C,B,Ms1) ), hanoi( N1,C,B,A,Ms2 ), append( Ms1, [A to B|Ms2], Moves ), lema( P ) P, asserta((P!)). testa_hanoi( N, Postes, Passos ) hanoi( N, A, B, C, Passos ), Postes=[A, B, C].
Prolog - 15
Operadores
forma standard de ler e escrever os termos com o functor seguido dos respectivos argumentos entre parnteses certas expresses ficam mais legveis usando operadores: 5 + 3 versus '+'( 5, 3 ) comando: op( Precedencia, Tipo, Op )
Precedncia de 1 a 1200
',' tem precedncia 1000; logo, operadores que possam aparecer como argumentos devem ter precedncia inferior a 1000 ou ficar entre parnteses, que corresponde a precedncia 0: assert( (a b) )
Tipo pretende desambiguar expresses definindo o tipo de associatividade e a posio (infixo: xfx, xfy, yfx; prefixo: fx, fy; posfixo: xf, yf)
Prolog - 16
Operadores
X+Y+Z
(X + Y) + Z yfx f - operador argumentos x: tm que ter precedncia inferior a f argumentos y: tm que ter precedncia superior a f legal? op(1000, xfy, ',') a, b, c -5+3
Prolog - 17
X +( Y + Z) xfy
Ciclos interactivos
os programas interactivos baseiam-se no processamento de efeitos laterais (leituras ou escritas, asserts, etc.)
eco read( X ), eco( X ). eco( X ) eof( X ), !. eco( X ) write( X ), nl, read( Y ), !, eco( Y ). eof( end_of_file ).
se estiver a ler do teclado, basta escrever end_of_file; se o canal de entrada for um ficheiro, esse o termo que aparece ao chegar ao fim (no esquecer que os termos terminam com um '.')
Prolog - 18
Interpertador de comandos
exemplo de uma shell para executar comandos (termina com o comando fim):
shell shell_prompt, read( Golo ), shell( Golo ). shell( fim ) !. shell( Golo ) ground( Golo ), !, resolve_instanciado( Golo ), shell. shell( Golo ) resolve( Golo ), shell. resolve( Golo ) Golo, write( Golo ), nl, fail. resolve( Golo ) write( 'Nao ha mais.' ), nl. resolve_instanciado( Golo ) Golo, write( 'Sim.' ), nl. resolve_instanciado( Golo ) write( 'Nao.' ), nl. shell_prompt write( 'Comando> ' ).
Prolog - 19
sucedem e portanto instanciam variveis se no forem bem optimizados ocupam muito a stack em computaes longas
se s interessam os efeitos laterais e h problemas de espao, usar um ciclo repeat-fail (a computao oscila entre o repeat e o fail)
eco repeat, read( X ), eco( X ), !. eco( X ) eof( X ), !. eco( X ) write( X ), nl, fail. eof( end_of_file ).
Prolog - 20
Consultar
Comentrios
predicado interior ao ciclo (eco/1, ciclo/0) falha sempre, excepto na clusula de sada cut na clusula com repeat para evitar ciclo infinito em retrocesso de fora do ciclo
No determinismo
solucao( X ) gera( X ), testa( X ).
gerao e teste um mtodo geral que aproveita muitas vezes o funcionamento bidireccional dos predicados
implementaes tendem a ser ineficientes se a gerao no for dirigida; para obviar a isso imbrica-se o teste na gerao
Prolog - 22
X is Y+N; X is Y-N.
Conjuntos de solues
defeitos
ineficincia cada soluo recomea no incio da rvore de pesquisa falta de generalidade instanciao progressiva reduz nmero de solues
Predicados de conjuntos
bagof( Termo, Golo, Intancias ) Instancias o multiconjunto de todas as instncias de Termo para as quais o Golo satisfeito (inclui repetidos) setof( Termo, Golo, Intancias ) semelhante, mas sem valores repetidos e ordenado
chamada: filhos( X, Fs )
respostas:
X= terach Fs= [haran, nachor, abraao] ; X= haran Fs= [lot, milcah, yiscah]; X= abraao Fs= [isaac]; X= isaac Fs= [jacob]
Prolog - 25
Quantificao existencial
se se pretender todos os filhos independentemente dos pais, necessrio quantificar existencialmente o pai para este no aparecer na soluo (evitando a partio) setof( Y, X^pai(X,Y), Filhos )
Prolog - 26
Outras tcnicas
nmero de solues de G: setof( X, G, Ys ), length( Ys, NSol) pesquisa em profundidade: regra de computao normal do Prolog pesquisa em largura: para cada n, obter o conjunto dos que lhe esto directamente ligados e process-los antes de descer para o nvel inferior
Prolog - 27
Listas de diferena
para realar o facto de se tratar de uma mesma estrutura, podese usar um operador para representar as listas de diferena Xhead/Xtail ou dois argumentos separados vantagem: eficincia, faz a concatenao em tempo constante e no linear no 1 arg
Prolog - 29
resultado: Ls=[1,2] Ks= [a,b,c,1,2]/[] generalizao do conceito de acumulador aplana( xs, Ys ) aplana_ld( Xs, Ys/[] ). aplana_ld( [X|Xs], Ys/Zs ) aplana_ld( X, Ys/Ys1 ), aplana_ld( Xs, Ys1/Zs). aplana_ld( X, [X|Xs]/Xs ) atomic( X ), X \= []. aplana_ld( [], Xs/Xs ).
Prolog - 30
Estruturas incompletas
% ve( Chave, Dicionario, Valor ) Dicionario contm Valor indexado por Chave ( Dicionrio constitudo por pares (Chave, Valor) ) ve( Chave, [(Chave,Valor)|Dic], Valor ). ve( Chave, [(Chave1,Valor1) | Dic ], Valor ) Chave \= Chave1, ve( Chave, Dic, Valor ).
uso do dicionrio ( implementado com lista, mas podia ser rvore binria, ...)
ve( fatima, [(ana,1611),(joao,4245)|Dic],1812) sucede e instancia o dicionrio mais um pouco ve( joao, [(ana,1611),(joao,4245), (fatima,1812)|Dic], X ) sucede com X=4245
Prolog - 31
Meta-interpretadores
Meta-interpretador interpretador de uma linguagem escrito na prpria linguagem. % resolve( Golo ) Golo verdade relativamente ao programa em causa
Prolog - 32
Meta-interpretadores especiais
granularidade do metainterpretador de 3 linhas suficiente para resolver problemas interessantes, sem tornar o sistema demasiado lento; permite controlar a ordem de execuo dos golos ou registar um trao da execuo
% resolve( G, Arvore ) Arvore contem uma rvore de prova de G resolve( true, true ). resolve( (A,B), (ProvaA, ProvaB ) resolve( A, ProvaA ), resolve( B, ProvaB ). resolve( A, true ) sistema( A ), A. % tabela para sistema/1 resolve( A, (A Prova) ) clause( A, B ), resolve( B, Prova ).
Prolog - 33
Janelas de texto
wcreate(janTexto,text,`Janelinha`,200,125,400,225,0).
cria uma janela de topo
wedtsel((janTexto,1), 0, 30000 ).
selecciona texto no controlo 1 da janTexto
wedttxt((janTexto,1), Dados ).
le o texto seleccionado
wclose( janTexto ).
fecha a janela
Prolog - 34
wdict( D ).
devolve uma lista com os nomes das janelas de topo
chdir( Corrente ).
muda de directorio corrente
exec('notepad.exe',' ',_).
executa um programa externo
Prolog - 35
Construo de janelas
wcreate(janBotoes,user,`Botoes`, 200,125,400,225,0 ).
cria um janela user - faz parte do MDI (Multiple Document Interface), janela do LPA-Prolog; um dilogo autnomo
Botes
wcreate( (janBotoes,2), button, `Nao da`, 100, 150, 80, 32, 16'50010003 ).
checkBox
wenable( (janBotoes,2), 1 ).
activa/desactiva controlo
Prolog - 37
wtext( (janBotoes,5), T ).
le (ou escreve, se T instanciado) o conteudo da janela
wlbxadd( (janBotoes,6), -1, `Vermelho` ). wlbxadd( (janBotoes,6), -1, `Verde` ). wlbxsel( (janBotoes,6), 2, 1 ).
selecciona o elemento 3 como activo
wlbxget( (janBotoes,6), 1, T ).
consulta o 2 elemento da lista Prolog - 38
Mens
wmcreate( menu1 ).
cria um menu.
wmnuadd( menu1, -1, `&Pratos`, 1001). wmnuadd( menu1, -1, `&Sobre`, 1002). wmnuadd( 0, 3, `Menu`, menu1).
adiciona menu ao menu geral da aplicacao
wmnusel(menu1,0,1).
poe marca na primeira opcao do menu
wmdict( D ).
devolve a lista de menus activos
wmnudel(0,3).
retira a entrada do menu1 na barra do WIN-Prolog (menu 0)
wmclose( menu1 ).
elimina menu, depois de ter sido retirado de onde quer que seja usado Prolog - 39
Mensagens
Arquitectura geral
interaco com Windows baseada em eventos que interrompem o Prolog, so processados e retomam o golo interrompido s alguns eventos do Windows chegam ao Prolog (menus, dilogos, ) recepo da mensagem pelo LPA-Prolog
anzol: ?MESSAGE?(Window, Message, Data, Goal), apanha todas as mensagens em bruto, excepto as usadas internamente nos menus Edit e Windows
processamento
separao em classes e processamento de parmetros interrupo do programa, desactivao das interrupes, chamada de um processador da mensagem (handler)
anzol: ?FIND?/4, ?TIMER?/3 reactivao das interrupes, retoma do golo interrompido
Prolog - 40
Processadores de mensagens
Prolog - 41
Mensagens predefinidas
'?FIND?'(Window, msg_fbfndnxt, Goal):!, fndbox(``, 1), wflag(1), Goal. '?FIND?'(Window, Message, Goal):find_hook(Window, Message, Goal). Ignora as mensagens Find Next '?CHANGE?'(Window, msg_cbclose, Goal):!, msgbox('Mensagem','A janela vai fechar!',0,_), chgbox(``,``, -1), wflag(1), Goal. '?CHANGE?'(Window, Message, Goal):change_hook(Window, Message, Goal). Processa as mensagens Close
Prolog - 42
Grficos
Prolog - 44