Temos um cenário com um conjunto de salas, e dentro dessas salas
podem existir bolas. Um robô está encarregado de mover as bolas entre as
salas. O robô possui duas pinças: uma left
(esquerda) e outra right
(direita), que
ele usa para segurar as bolas.
O objetivo dessa tarefa é transferir todas as bolas de uma sala inicial para uma sala destino. Para que isso seja feito, o robô usa suas duas pinças para pegar as bolas em uma sala e levá-las para outra sala, uma de cada vez.
Você deve escrever um programa que leia da Entrada padrão a descrição do mundo, contendo a quantidade de salas, quantidade de bolas, posição inicial de cada bola e onde cada bola deve terminar.
Assuma que as pinças left
e right
sempre iniciam livres e o robô inicia na
primeira sala descrita.
A entrada é composta por um único caso de teste. A primeira linha, do caso de teste, possui dois números inteiros e , e , representando, respectivamente, o número de salas e o número de bolas existentes no problema.
A segunda linha, do caso de teste, possui strings, de comprimento máximo de 100 caracteres, representando os nomes das salas do problema.
Depois existirão linhas, cada uma contendo strings, , de comprimento máximo de 100 caracteres, representando, respectivamente, o nome da i-ésima bola, a sala em que a bola começa e a sala que a bola deve terminar.
A saída do seu programa deverá ser um arquivo PDDL, gerado na saída padrão, representando, o arquivo de problema específico definido na entrada.
Observação: Certifique-se de que seu arquivo de problema é funcional, executando um planejador PDDL com o domínio e problema definidos.
Observação2: Você pode testar o seu exemplo diretamente pelo sistema https://plan-editor.naquadah.com.br/
Abaixo está o arquivo de domínio que define a infraestrutura básica do sistema:
(define (domain gripper-typed)
(:requirements :typing)room ball gripper)
(:types - gripper)
(:constants left right
(:predicates- room) ;; O robô está em uma sala
(at-robby ?r - ball ?r - room) ;; Uma bola está em uma sala
(at ?b - gripper) ;; A pinça está livre
(free ?g - ball ?g - gripper)) ;; Uma pinça está segurando uma bola
(carry ?o
;; Ação de mover o robô entre salas
(:action move- room)
:parameters (?from ?to
:precondition (at-robby ?from)and (at-robby ?to)
:effect (not (at-robby ?from))))
(
;; Ação de pegar uma bola com uma das pinças, em uma determinada sala
(:action pick- ball ?room - room ?gripper - gripper)
:parameters (?obj and (at ?obj ?room) (at-robby ?room) (free ?gripper))
:precondition (and (carry ?obj ?gripper)
:effect (not (at ?obj ?room))
(not (free ?gripper))))
(
;; Ação de soltar uma bola de uma pinça em uma sala específica
(:action drop- ball ?room - room ?gripper - gripper)
:parameters (?obj and (carry ?obj ?gripper) (at-robby ?room))
:precondition (and (at ?obj ?room)
:effect (
(free ?gripper)not (carry ?obj ?gripper))))) (
2 4
salaA salaB
bola1 salaA salaB
bola2 salaA salaB
bola3 salaA salaB
bola4 salaA salaB
(define (problem problemagarra)
(:domain gripper-typed)
(:objects
salaA salaB - room
bola1 bola2 bola3 bola4 - ball)
(:init (at-robby salaA)
(free left)
(free right)
(at bola1 salaA) (at bola2 salaA) (at bola3 salaA) (at bola4 salaA) )
(:goal (and (at bola1 salaB) (at bola2 salaB) (at bola3 salaB) (at bola4 salaB) )))
3 4
salaA salaB salaC
bola1 salaA salaC
bola2 salaB salaC
bola3 salaC salaA
bola4 salaB salaA
(define (problem problemagarra)
(:domain gripper-typed)
(:objects
salaA salaB salaC - room
bola1 bola2 bola3 bola4 - ball)
(:init (at-robby salaA)
(free left)
(free right)
(at bola1 salaA) (at bola2 salaB) (at bola3 salaC) (at bola4 salaB) )
(:goal (and (at bola1 salaC) (at bola2 salaC) (at bola3 salaA) (at bola4 salaA) )))
Você não precisa se preocupar com a identação. Basta gerar um arquivo de problema válido.
Author: Bruno Ribas, baseado no domínio GRIPPER do IPC-1998