Você está na página 1de 44

Tipo dos termos

Predicados de sistema para tipos

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

Estrutura dos termos

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

Nota: estes predicados so bidireccionais; functor e univ (=..) tambm constroem

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

subtermo( N, Sub, Termo ) arg( N, Termo, Arg ), subtermo( Sub, Arg ).


% subtermo( Sub, Termo ) Sub um subtermo do termo fechado Termo subtermo( Termo, Termo ). subtermo( Sub, Termo ) Termo =.. [F|Args], subtermo_lista( Sub, Args ). subtermo_lista( Sub, [Arg|Args] ) subtermo( Sub, Arg ). subtermo_lista( Sub, [Arg|Args] ) subtermo_lista( Sub, Args ).

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

see( F ) abre um canal de leitura para o ficheiro F e torna-o corrente


se j estiver aberto, limita-se a pr o canal como corrente todas as leituras so do canal corrente

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

tell( F ) semelhante a see( F ), mas para escrita


a linha de texto s enviada para o canal quando ocorrer um fim de linha (nl)

telling( F ) como seeing( F ) told fecha o canal de sada corrente

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

definio do predicado member/2


assert( member( X, [X|Xs] ) ). assert( (member( X, [Y|Xs] ) member( X, Xs )) ).

asserta( Clausula ) adiciona no princpio

Prolog - 12

Acesso ao programa

retract( Clausula ) elimina a primeira clusula que unifica com Clausula

forma de copiar termos, criando variveis novas


copy( X, Y ) assert( $tmp( X ) ), retract( $tmp( Y ) ).

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

op(500, yfx, [(+),(-)]) op(500, fx, [(+),(-)])

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

Ciclos baseados em falha

os ciclos anteriores so baseados em recurso na cauda (enrolam sempre)


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

repeat sucede sempre; implementvel como


repeat. repeat repeat.

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

como consultar um ficheiro


consult( Ficheiro ) see( Ficheiro ), ciclo, seen. ciclo repeat, read( Clausula ), processa( Clausula ), !. processa( end_of_file ) !. processa( Clausula ) assert( Clausula ), fail.
Prolog - 21

No determinismo
solucao( X ) gera( X ), testa( X ).

gerao e teste um mtodo geral que aproveita muitas vezes o funcionamento bidireccional dos predicados

intersecta( Xs, Ys ) member( X, Xs ), member( X, Ys ).

implementaes tendem a ser ineficientes se a gerao no for dirigida; para obviar a isso imbrica-se o teste na gerao

Prolog - 22

Problema das ranhas


% rainhas( N, Rainhas ) Rainhas uma lista com a posio em cada coluna que resolve o problema rainhas( N, Rs ) gama( 1, N, Ns ), rainhas( Ns, [], Qs ). rainhas( NaoRs, JaRs, Rs ) selecciona( R, NaoRs, NaoRs1 ), not ataca(R, JaRs ), rainhas( NaoRs1, [R, JaRs, Rs] ). rainhas( [], Rs, Rs ). gama( M, N, [M|Ns] ) M<N, M1 is M+1, gama( M1, N, Ns ). gama( N, N, [N] ). select( X, [X|Xs], Xs ). select( X, [Y|Ys], [Y|Zs] ) select( X, Ys, Zs ). ataca( X, Xs ) ataca( X, 1, Xs ). ataca( X, N, [Y|Ys]

X is Y+N; X is Y-N.

ataca( X, N, [Y|Ys] ) N1 is N+1, ataca( X, N1, Ys ). Prolog - 23

Conjuntos de solues

obter todos os filhos de um dado pai

soluo com acumulador


filhos( X, Fs ) filhos( X, [], Fs ). filhos( X, A, Fs ) pai( X, F ), not member( F, A ), !, filhos( X, [F|A], Fs ). filhos( X, Fs, Fs ).

defeitos
ineficincia cada soluo recomea no incio da rvore de pesquisa falta de generalidade instanciao progressiva reduz nmero de solues

implementao com conjuntos ideia semelhante das funes de memorizao


s percorre a rvore de pesquisa uma vez e no instancia as variveis porque tem um ciclo com falha logo aps o assert criar clusulas (e depois destru-las) inerentemente pesado
Prolog - 24

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

filhos( X, Filhos ) setof( Y, pai(X,Y), Filhos ) chamada: filhos( terach, Fs )

resposta: Fs= [haran, nachor, abraao]

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 )

resp.: [haran, nachor, abraao, lot, milcah, yiscah, isaac, jacob]

o que d? setof( Pai-Filhos, setof( X, pai(Pai,X), Filhos ), Ys )

resp.: [terach-[haran, nachor, abraao], haran-[lot, milcah, yiscah], abraao-[isaac], isaac-[jacob]]

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

Predicados de segunda ordem

mapa( Xs, P, Ys ) Ys a lista dos resultados da aplicao de P a cada X


definio de segunda ordem

mapa( [X|Xs], P, [Y|Ys] )


P( X, Y ), mapa( Xs, P, Ys ). mapa( [], P, [] ). implementao em Prolog mapa( [X|Xs], P, [Y|Ys] ) aplica( P, X, Y ), mapa( Xs, P, Ys ). mapa( [], P, [] ). aplica( P, X, Y ) G =.. [P,X,Y], G.
Prolog - 28

Listas de diferena

ideia: representar sequncias de elementos como diferenas entre pares de listas

1,2,3 pode ser a diferena entre


[1,2,3,4,5] e [4,5] ou [1,2,3,8] e [8] ou [1,2,3] e [] ou [1,2,3|Xs] e Xs

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

Exemplo de listas de diferena


Xs Xs/Ys Ys Ys/Zs Zs Xs/Zs % append_ld( As, Bs, Cs ) a lista de diferena Cs o resultado de concatenar as listas de diferena compatveis As e Bs append_ld( Xs/Ys, Ys/Zs, Xs/Zs).

chamada: append_ld( [a,b,c|Ls]/Ls, [1,2]/[], Ks )

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

interpretador trivial (e pouco til... embora usado no exemplo da shell)


resolve( G ) G.

interpretador de trs linhas


resolve( true ). resolve( (A,B) ) resolve( A ), resolve( B ). resolve( A ) clause( A, B ), resolve( B ). % true % conjuno % reduo

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

wedtsel((janTexto,1), Ini, Fim ).


Interroga sobre quais os limite de uma seleccao

wedttxt((janTexto,1), Dados ).
le o texto seleccionado

wedttxt((janTexto,1), `Olare meu` ).


escreve no texto seleccionado

wclose( janTexto ).
fecha a janela

wedtlin( (janTexto,1), 100, IniLinha, FimLinha ).


indica os offsets de inicio e fim de linha para um offset dado; so wedtsel altera a seleccao

Prolog - 34

Mais interface Windows


wcount( (janTexto,1), Caract, Palavras, Linhas ).


conta

wedtfnd( (janTexto,1), 0, 30000, `Goal`, Ini, Fim ).


offsets da palavra em pesquisa

wdict( D ).
devolve uma lista com os nomes das janelas de topo

msgbox( 'Prologochi', 'Tenho fome.', 48, Codigo ).


dialogo com um estilo indicando numero de botoes, cada qual correspondendo a um codigo de retorno

dirbox( 'Ficheiros', 'Escolha um:', '*.doc', Fich ).


ficheiro

chdir( Corrente ).
muda de directorio corrente

exec('notepad.exe',' ',_).
executa um programa externo

Prolog - 35

Construo de janelas

wcreate( janGeral, dialog, `Dialogo`, 200, 125, 400, 225, 16'90c80000 ).


cria um janela de dialogo de topo

wcreate( (janGeral,1), button, `Pois`, 10, 150, 80, 32, 16'50010000 ).


cria um botao na janela

wcreate( janGeral, dialog, `Dialogo`, 200, 125, 400, 225, 16'80c80000 ).


cria um janela invisivel de dialogo de topo

wshow( janGeral, 1 ), wfocus((janGeral,1)).


mostra (1), esconde (0), iconifica (2), maximiza (3) e foca

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

wcreate( (janBotoes,1), button, `Pois`, 10, 150, 80, 32, 16'50010000 ).


cria um botao na janela Prolog - 36

Botes

wcreate( (janBotoes,2), button, `Nao da`, 100, 150, 80, 32, 16'50010003 ).
checkBox

wcreate( (janBotoes,3), button, `Esta`, 190, 150, 80, 32, 16'50010009 ).


radioButton

wcreate( (janBotoes,4), button, `Aquela`, 280, 150, 80, 32, 16'50010009 ).


cria um botao na janela

wenable( (janBotoes,2), 1 ).
activa/desactiva controlo

wbtnsel( (janBotoes,3), Est ).


interroga/poe o estado de botoes

wcreate( (janBotoes,5), edit, `Notas`, 10, 200, 80, 64, 16'50810005 ).


cria uma caixa de texto na janela

Prolog - 37

Caixas de texto e listas

wedtsel( (janBotoes,5), 30, 40 ), wedttxt( (janBotoes,5), `Novo texto aqui! ` ).


selecciona e altera texto

wtext( (janBotoes,5), T ).
le (ou escreve, se T instanciado) o conteudo da janela

wcreate( (janBotoes,6), listbox, ` `, 10,125,80,64, 16'50a10002 ).


cria uma lista

wlbxadd( (janBotoes,6), -1, `Amarelo` ).


adiciona elementos a lista na posicao default

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, `&Sopas`, 1000).


acrescenta uma linha Sopas no fim com codigo 1000

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

Esquema dos anzis


'?CLASS?'(Window, Message, Data, Goal):!, ..., wflag(1), Goal. '?CLASS?'(Window, Message, Data, Goal):class_hook(Window, Message, Data, Goal). CLASS uma das classes existentes se existir o anzol, chamado, seno chama-se directamente class_hook/3 Window o controlo antes do que chamou o anzol o anzol pode processar alguns casos e deixar os outros para a rotina geral no esquecer de reactivar as interrupes (wflag(1)) e de chamar o golo interrompido

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

Ciclo com Timer


go( S ):- T is S*4660, abolish(intervalo/1), assert(intervalo(T)), timer( 1, T), repeat, write('Diga'), read(X), processa(X). processa( fim ):- !, timer( 1, 0). processa( X ):- write(X), nl, fail. '?TIMER?'(Timer, Inter, Goal):msgbox('Aviso', 'Timer em accao', 0, _), wflag(1), intervalo(T), timer( Timer, T), Goal.
Prolog - 43

Grficos

wcreate( (janBotoes,7), grafix, ` `, 100,125,80,64, 16'50800000 ).


cria um grafico

wgfx( (janBotoes, 7), [brsh(128,0,0,0), elip(10,10,70,54)]).


sequencia de operacoes

Prolog - 44

Você também pode gostar