310 likes | 428 Views
CHREK. Marcos Aurélio E-mail: maurelio1234@gmail.com MSN: maurelio1234@hotmail.com. Baixando o CHREK. Abrir a pasta \cin01scratch_maas$ na rede do CIN Copiar a pasta chrek para C:temp Executar o context. Configurando o Context. Configurar atalhos em:
E N D
CHREK Marcos Aurélio E-mail: maurelio1234@gmail.com MSN: maurelio1234@hotmail.com
Baixando o CHREK • Abrir a pasta \\cin01\scratch_maas$\ na rede do CIN • Copiar a pasta chrek para C:\temp\ • Executar o context
Configurando o Context • Configurar atalhos em: • Options > Environment Options > Execute Keys • Atalhos configurados no editor • F9 – GUI para acompanhamento passo da execução • F10 – Explicação do raciocínio no Console do Context e no arquivo console.txt
Definindo um GOAL • A execução de um programa CHR sempre inicia com a definição de um goal e de um conjunto de regras • A execução de um programa CHR se dá através da aplicação iterativa das regras Regras Regras Goal Estadoinicial Estadofinal ...
Definindo as Regras (1) • Existem três tipos de regras: • Propagation • Head ==> Guard | Body. “SE ‘Estado’ contém ‘Head’ e ‘Guard’ é verdadeiroENTÃO adicione ‘Body’ ao ‘Estado’” • Simplification • Head <=> Guard | Body. “SE ‘Estado’ contém ‘Head’ e ‘Guard’ é verdadeiroENTÃO substitua ‘Head’ por ‘Body’ no ‘Estado’ atual” • Simpagation • Head \ HeadRemove ==> Guard | Body. “SE ‘Estado’ contém ‘Head’ e ‘HeadRemove’ e ‘Guard’ é verdadeiroENTÃO adicione ‘Body’ e remova ‘HeadRemove’”
Definindo as Regras (2) - Constraints • O Head, Guard e Body são conjuntos de constraints. • Existem dois tipos de constraints: • Built-ins: implementadas através de classes Java e reconhecidas automaticamente pelo compilador (basta estar no CLASSPATH) Ex: writeLn • Definidas pelo usuário: qualquer constraint que apare;a no programa e não seja built-inEx: adjacent, connected…
A = B true false ground(X) unbound(X) ne(X,Y) X != Y le(X,Y) X>=Y ge(X,Y) X<=Y lt(X,Y) X<Y gt(X,Y) X>Y writeLn(X) write(X) readInt(X) instanceOf(X,Str) Definindo as Regras (3) – Constraints Built-in
Definindo as Regras (4) • O Head é sempre uma conjunção de constraints definidas pelo usuário Head ==> Guard | Body. Head <=> Guard | Body. HeadAdd \ HeadRemove ==> Guard | Body. • O Guard é sempre uma conjunção de constraints built-in (*) • O Body é uma conjunção ou disjunção de constraints quaisquer
Definindo as Regras (5) • Exemplos de regras: fib(N,M) ==> ge(N,2) | T1 = N~1, fib(T1,M1), T2 = N~2, fib(T2,M2), M=M1+M2. max(X,Y,Z) <=> le(X,Y) | Z = Y. prime(I) \ prime(J) ==> modEqual(J, I, 0) | true.
Definindo o GOAL • O goal é definido através de uma regra especial: main() <=> true | writeLn("hello world"). estado inicial parte fixa
Exemplos - Max max(X,Y,Z) <=> le(X,Y) | Z = Y. max(X,Y,Z) <=> le(Y,X) | Z = X. max(X,Y,Z) ==> true | le(X,Z), le(Y,Z). main() <=> true | max(17,139,M).
Convenções Adotadas • Variáveis • X [X Y Z W] (2) • Regras • a() ==> true | (c() ; d() ) <<1>> Nome da Variável Variáveis Relacionadas (X=Y=Z=W) Valor Corpo da regra que será aplicado da próxima vez que a regra for aplicada
Tracer (F9) Regras do programa Restrições Definidas pelo usuário Restrições Built-in Explicação
Explicação do raciocínio (F10) • Apresenta de forma textual todos os passos e decisões tomados durante a execução do programa • Incluir a diretiva de compilação “:- explain” no início do programa e pressionar F10
Explicação do raciocínio (F10) Initializing handler max... CHRv Program R1:: max(X, Y, Z)<=>X <= Y|Z = Y R2:: max(X, Y, Z)<=>Y <= X|Z = X R3:: max(X, Y, Z)==>true|X <= Z, Y <= Z Query: max(17, 139, M), result(M) Nome do programa sendo executado Regras do programa (A regra que define o goal não aparece aqui!) Estado inicial (GOAL)
Explicação do raciocínio (F10) Explanation in detail: (1) R1:: max(X, Y, Z)<=>X <= Y|Z = Y reason: max(X_2[17], Y_3[139], M_1) matched added: M_1 = Y_3[139], X_2[17] <= Y_3[139] removed: max(X_2[17], Y_3[139], M_1) (1st choice) (2) [backtrack], reason: no more rules to apply. { result(M_1[139]) } Regra que foi aplicada Constraints que ativaram a regra Efeito da aplicação da regra Corpo da regra que foi aplicado Motivo do backtrack Estado no CS no momento do Backtrack
Triangram • Usa apenas triângulos como tipos básicos
Triangram • Os tipos de polígonos que podem ser formados também limitado.
Triangram – Implementação • Goal • Cenário • Hierarquia de classes • Rules • Invariantes • Métodos • Query regras de propagação com as pré-condições como head e uma constraint definida pelo usuário como body. • Transacional regras de simpagation com pré-condições no head, remoções no HeadRemoval e pós-condições no body.
Triangram – Implementação Goal main() <=> true | ... Hierarquia de classes sub(scaleneTriangle,triangle), sub(isoscelesTriangle,triangle), sub(equilateralTriangle,isoscelesTriangle), ... Cenário isa(tri1, equilateralTriangle), sideOf(s11, tri1), adjacent(s11,s22), ...
Triangram – Implementação Invariantes ... adjacent(X,S) ==> true | adjacent(S,X). isa(X,triangle), sideOf(S1,X), sideOf(S2,X), lengthOf(S1,L1), lengthOf(S2,L2) ==> ne(S1,S2), L1=L2 | isa(X, regularPolygon).
Triangram – Implementação Métodos de Query ... isa(Pol1, rectangle), isa(Pol2, isoscelesTriangle), ... ==> ne(P1, Pol2), ne(P2, Pol2) | isCompatible(Pol1,Pol2, SidePol1, SidePol2).
Triangram – Implementação Métodos Transacionais ... isa(Pol1, triangle), isCompatible(Pol1, Pol2, SidePol1, SidePol2), isa(Pol2, triangle) ... \ adjacent(A11,SidePol1), adjacent(A22, SidePol2) ... ==> ne(A11,A12), ne(A21,A22) | adjacent(A11, A22), adjacent(A12, A21), ..., isa(Pol3, rectangle).