160 likes | 266 Views
Rodar Prolog2 no Unix Shell. Conectar-se em limoeiro. Incluir /usr/local/prolog2/sys no seu path. Digitar prolog2 no prompt Unix. Digitar consult(" <FILE_NAME> "). no prompt do prolog2. Digitar <TOP_LEVEL_PREDICATE> no prompt do prolog2.
E N D
Rodar Prolog2 no Unix Shell • Conectar-se em limoeiro. • Incluir /usr/local/prolog2/sys no seu path. • Digitar prolog2 no prompt Unix. • Digitar consult(" <FILE_NAME> "). no prompt do prolog2. • Digitar <TOP_LEVEL_PREDICATE> no prompt do prolog2. • Responder a pergunta de backtracking sistemático de prolog2. • Digitar halt. para sair do prolog2 file:prolog-ellf.ppt
prompt> more .cshrc set path = (. ~/bin \ /usr/local/prolog2/sys \ /usr/local/TeX/bin) ... prompt> more my_prog.pro append([],Y,Y). append([Xh|Xt],Y,[Xh|Rt]) :- append(Xt,Y,Rt). ## rsh limoeiro prompt> prolog2 ?- consult("my_prog.pro"). ?- reconsult("my_prog.pro"). yes ?- append([a,b,c],[d,e],R). R = [a,b,c,d,e] More (y/n)? y ?- halt. Leave Prolog (y/n) y prompt> Rodar Prolog2 no Unix-Exemplo
Etapas: Incluir no meu path: /usr/local/prolog2/sys Incluir no meu .emacs: (setq prolog-program-name "/usr/local/prolog2/sys/prolog2") Abrir uma janela X rodando emacs. Digitar <esc-x> run-prolog+ Repetir os passos dados para rodar Prolog no Unix (menos o que chama o Prolog) Vantagens: Modo especial para fechar parênteses de estruturas e colchetes de listas. esc-p+ para reutilizar comando precedente. Toda a janela de execução disponível para uso de comandos emacs (search, unkill, etc.) Divisão da janela emacs em dois buffers, um de execução e um de edicao de fonte ^x-o+ para passar de uma a outra janela. Divisão da janela emacs em varias sub-janelas com \verb+^x-2+ (para dividir) e \verb+^x-1+ (para juntar). Inconveniente: dever saber/aprender emacs :) Rodar Prolog2 no Emacs
Help On-line ?- help(bagof). ------------------------------------------------------------ BIP Help entry: bagof ------------------------------------------------------------ Call: bagof(X,Goal,L). Purpose: L is list of X such that Goal. Arguments: X Any Goal Goal + L List Description: Duplicates are not eliminated and the list is not sorted. If there are no solutions the call fails (never returns L = []). If Goal has variables not in X call may be resatisfiable. ------------------------------------------------------------
Listar predicados Built-in ?- apropos(wr) . ------------------------------------------------------------ Entries in help system matching "wr" are: ------------------------------------------------------------ seek_write write writeq writing_at open_readwrite open_write state(write_depth ------------------------------------------------------------
Listar predicados Built-in (cont.) ?-apropos. =.. =:= =< ... abolish abort ancestor ancestors print_ancestor arg assert asserta assertz at atom atomic atomprops backtrace back_msg call character_class clause close close_module do_tokens compile_tokens tidy_tokens conlist consult core create_character_cl create_module create_state_table create_stream create_token_class create_token_format create_token_proces create_type_class creep datatype debug debug_on debug_off ...
Ativar o Trace: PBI ?-trace. • Ativa o trace sistemático de todos os predicados. • Todos os objetivos(as chamadas) do interpretador são impressos (precedidos por ´CALL´). • Todos meus resultados (as saídas) são impressos (precedidos por `EXIT´). • Para interromper um trace: responder ´n´ ao prompt `?-'. ?-spy(Pred/Arity). • Ativa o trace de predicados específicos. • Imprime apenas os CALL e EXIT do predicado passado como argumento. • Os predicados são especificados por seu nome/aridade; onde a aridade é opcional. • spy([ ..., Pred1/Aity1, ...]). • para especificar uma lista de predicados a rastrear.
fac(0,1). fac(N,Fn) :- M is N-1, fac(M,Fm), Fn is N * Fm. append([],Y,Y). append([Xh|Xt],Y,[Xh|Rt]) :- append(Xt,Y,Rt). ?- trace. yes ?- append([a,b,c],[d,e],R). ( 1) 0 CALL: append([a,b,c],[d,e],_45) ? ( 2) 1 CALL: append([b,c],[d,e],_100) ? ( 3) 2 CALL: append([c],[d,e],_146) ? ( 4) 3 CALL: append([],[d,e],_192) ? ( 4) 3 EXIT: append([],[d,e],[d,e]) ( 3) 2 EXIT: append([c],[d,e],[c,d,e]) ( 2) 1 EXIT: append([b,c],[d,e],[b,c,d,e]) ( 1) 0 EXIT: append([a,b,c],[d,e],[a,b,c,d,e]) R = [a,b,c,d,e] More (y/n)? y Exemplo de Uso de trace
fac(0,1). fac(N,Fn) :- M is N-1, fac(M,Fm), Fn is N * Fm. append([],Y,Y). append([Xh|Xt],Y,[Xh|Rt]) :- append(Xt,Y,Rt). More (y/n)? y ( 1) 0 REDO: append([a,b,c],[d,e],[a,b,c,d,e]) ? ( 2) 1 REDO: append([b,c],[d,e],[b,c,d,e]) ? ( 3) 2 REDO: append([c],[d,e],[c,d,e]) ? ( 4) 3 REDO: append([],[d,e],[d,e]) ? ( 4) 3 FAIL: append([],[d,e],_192) ( 3) 2 FAIL: append([c],[d,e],_146) ( 2) 1 FAIL: append([b,c],[d,e],_100) ( 1) 0 FAIL: append([a,b,c],[d,e],_45) no ?- my_fac(3,R). ( 1) 0 CALL: my_fac(3,_5) ? n R = 6 More (y/n)? n yes ?- Exemplo de Uso de trace (cont.)
fac(0,1). fac(N,Fn) :- M is N-1, fac(M,Fm), Fn is N * Fm. append([],Y,Y). append([Xh|Xt],Y,[Xh|Rt]) :- append(Xt,Y,Rt). ?- spy(append/3). yes ?- append([a,b,c],[d,e],R). * ( 1) 0 CALL: append([a,b,c],[d,e],_28) ? n R = [a,b,c,d,e] More (y/n)? n yes ?- my_fac(3,R). R = 6 More (y/n)? n yes ?- spy(my_fac). yes ?- my_fac(1,R). * ( 1) 0 CALL: my_fac(1,_5) ? ( 2) 1 CALL: _59 is 1-1 {system}? ( 2) 1 EXIT: 0 is 1-1 * ( 3) 1 CALL: my_fac(0,_136) ? * ( 3) 1 EXIT: my_fac(0,1) ? ( 4) 1 CALL: _5 is 1*1 {system}? ( 4) 1 EXIT: 1 is 1*1 * ( 1) 0 EXIT: my_fac(1,1) ? R = 1 More (y/n)? n yes ?- Exemplo de Uso de Spy
Sair do modo Trace: PBI • ?-debugging.: mostra os predicados sendo espionados. • ?-notrace. : apaga o trace sistemático. Não apagar o trace `a la carte’: • ?-nospy(Pred/Arity). apaga apenas espionagem do predicado indicado. • ?-nospy([ ..., Pred/Arity ,...]).para apagar espionagem de mais de um predicado. • ?-nodebugging. : apaga o espionagem para todos os predicados.
Programação Dinamica Predicados Built-in para programação dinamica: Programa Prolog: • E um banco de dados dedutivo, • cujos fatos sao dados explicitos, • e cujas regras sao dados implicitos. Existem predicados built-in para: • Dinamicamente, dentro da execucao de outros predicados,inserir ou apagar dados no banco,i.e., inserir ou apagar elementos do programa Prolog em execu\cao.
Programação Dinamica (cont.) Predicados Built-in para programação dinamica: Esses predicados são: • Meta-lógicos, i.e. com uma semântica declarativa, alem da logica dos predicados. • Que cumprem suas tarefas com seus efeitos colaterais. • Necessarios apenas para meta-programacao, otimizacao e deducao nao monotonica. • Fazem com que um predicado possa ser verificado em um momento da computacao e nao verificado em um outro momento.
listing(Predicado) O argumento Predicado deve ser instanciado com um atomo, seja uma estrutura de predicado. Busca os fatos e regras que definem Predicado no ambiente corrente do interpretador. Se achar alguns, imprime todos eles de uma vez e responde yes. Se nao achar nenhum, responde no. Nao instancia as variaveis de Predicado. Util para debugging, especialmente de programas auto-modificadores. Listing - Listar predicados
append([],Y,Y). append([Xh|Xt],Y,[Xh|Rt]) :- append(Xt,Y,Rt). concat(S1,S2,Sr) :- list(L1,S1), list(L2,S2), append(L1,L2,Lr), list(Lr,Sr). ?- listing(append). /* append/3 */ append([],Y,Y) . append([Xh|Xt],Y,[Xh|Rt]) :- append(Xt,Y,Rt) . yes ?- listing(append(X,Y,R)). X = _4, Y = _12, R = _20 More (y/n)? y no ?- listing(P(X,Y,R)). Syntax error no. 7 Syntax: missing comma or operator Context: listing(P^[here](X,Y,R)). Evaluation aborted ?- Listing - Exemplo
clause(Conclusao,Premissa) Conclusao deve ser instanciado com uma estrutura de funtor especificado. Busca os fatos e regras que definem Conclusao no ambiente corrente do interpretador. Se achar um fato que se unifica com Conclusao, instancia a Premissa com true. Se achar uma regra cuja conclusao se unifica com Conclusao,instancia Premissa com a premissa desta regra. Se nao achar, responde no. Se re-chamado dentro de um backtracking, instancia Premissa com o proximo fato ou proxima regra que a define. ?- clause(member(X,Y,R)). no ?- clause(append(X,Y,R),Z). X = [], Y = _29, R = _29, Z = true More (y/n)? y X = [_66|_67], Y = _29, R = [_66|_71], Z = append(_67,_29,_71) More (y/n)? y no ?- clause(append,Z). no ?- clause(Z,append(X,Y,R)). Error no. 11 Bad predicate rep Error goal: clause(_62/_63,append(_29,_37,_45)) Evaluation aborted ?- Clause - Exemplo