Lista de exercícios 2 - Soluções 1. Op(ACTION: MoveBParaCima, PRECONDITIONS: BrancoEm(x) EFFECTS: BrancoEm(Up(x)) ^ NOT BrancoEm(x) ) Op(ACTION: MoveBParaDireita, PRECONDITIONS: BrancoEm(x) EFFECTS: BrancoEm(Right(x)) ^ NOT BrancoEm(x) ) Op(ACTION: MoveBParaBaixo, PRECONDITIONS: BrancoEm(x) EFFECTS: BrancoEm(Down(x)) ^ NOT BrancoEm(x) ) Op(ACTION: MoveBParaEsquerda, PRECONDITIONS: BrancoEm(x) EFFECTS: BrancoEm(Left(x)) ^ NOT BrancoEm(x) ) 2. Possível representação: Fig A: Dentro (Triangulo, Quadrado) ^ Dentro(TrianguloPequeno,Triangulo) Fig. B: Dentro(Triangulo, Quadrado) ^ NOT Dentro(x, Triangulo) Fig. C: Dentro (Circulo, Quadrado) ^ Dentro(CirculoPequeno,Circulo) Fig. 1: Dentro(Circulo,Quadrado) ^ Dentro(QuadradoPequeno,Circulo) Fig 2. Dentro(QuadradoPequeno,Quadrado) Fig 3: Dentro(Circulo,Quadrado) ^ NOT Dentro(x,Circulo) Fig. 4: Dentro(Quadrado,QyadradoMedio) ^ NOT Dentro(x,QuadradoMedio) Fig. 5: Dentro(Triangulo,Quadrado) ^ NOT Dentro(x,Triangulo) Op(ACTION: Remove(x), PRECONDITIONS: Dentro(x,y), EFFECTS: Fora(x,y) ) Dentro(x,y) assume que alguma figura x está inserida em alguma figura y. A pós-condição mais natural seria NOT Dentro(x,y), porém isto faria com que eu fosse obrigada a ustilizar uma pré-condição com literal negativo no passo final, o que não é permitido na linguagem STRIPS. Na verdade, quando defini a figura B que vai ser a pré-condição do estado final, quando quero transformar A em B, um literal negado vai aparecer na pré-condição. Para evitar isto, re-escrevemos todos os NOT Dentro(x,y) como Fora(x,y) ou como NaoDentro(x,y). A regra Remove(x) funciona tanto para transformar A em B quanto para transformar B em 3. (verifiquem montando o plano...) 3) Op(ACTION: Entornar(f1,f2), PRECONDITIONS: Cont(f1,x) ^ Cont(f2,y), EFFECTS: Cont(f1,0) ^ Cont(f2,y+x) ) Op(ACTION: Encher(f1,f2), PRECONDITIONS: Cont(f1,x) ^ Cont(f2,y), EFFECTS: Cont(f1,x-c) ^ Cont(f2,y+c) ) Dificuldade: manipular as expressões aritméticas. 4) Op(ACTION: Troca(x,y), PRECONDITIONS: Cont(x,a) ^ Cont(y,b), EFFECTS: Cont(x,b) ^ Cont(y,a) ) Geração do plano: 1) Plano inicial contendo ações Start e Finish: STEPS: {Op(ACTION: Start, EFFECTS: Cont(X,A) ^ Cont(Y,B) ^ Cont(Z,C)), Op(ACTION: Finish, PRECONDITIONS: Cont(X,C) ^ Cont(Y,B) ^ Cont(Z,A)) } 2) Procurar alguma ação do plano ou do conjunto de ações que tenha uma pós-condição que unifique com alguma pré-condição do passo Finish: adicionamos a ação Troca(x,y): +--------+ | Start | +--------+ Cont(X,A) ^ Cont(Y,B) ^ Cont(Z,C) \ / 3 \ / 4 \ / Cont(x,a) ^ Cont(y,b) +--------+ | Troca | +--------+ Cont(x,b) ^ Cont(y,a) 1 / 2 \ {x/X,b/C,y/Z,a/A} / \ / \ Cont(X,C) ^ Cont(Y,B) ^ Cont(Z,A) +---------+ \ | Finish | \-------- é resolvida com Cont(Y,B) +---------+ do passo inicial 5) {x/A, Y/b, z/b} não unifica! {y/x, x/John} entra em loop se não houver verificação de ocorrência (occur-check) 6) Está na lista de soluções de exercícios do Russel 7) Idem 8) Precisa de conceitos adicionais do capítulo 13.