#! /bin/bash ############################################################################# # Propositional ReliefWork Domain # ############################################################################# # Copyright (C) 2006 by Muhammad Abdul Hakim Newton mahnewton@gmail.com # # # # This program is free software; you can redistribute it and/or modify # # it under the terms of the GNU General Public License as published by # # the Free Software Foundation; either version 2 of the License, or # # (at your option) any later version. # # # # This program is distributed in the hope that it will be useful, # # but WITHOUT ANY WARRANTY; without even the implied warranty of # # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # # GNU General Public License for more details. # # # # You should have received a copy of the GNU General Public License # # along with this program; if not, write to the # # Free Software Foundation, Inc., # # 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # ############################################################################# # global variables declare PROGRAM=$0 # program name declare -i COUNT=$# # parameter count declare DOMAIN=$(basename $0 | sed -r s/\.[[:alnum:]_-]+$//) # domain and file names are same declare OPTION=$1 # generate the domain (-d) or a problem (-p) or usage () # global functions declare -f explain declare -f domain declare -f problem # explain usage and game rules function explain { echo echo "Usage for domain:" echo " $PROGRAM -d [ey|en]" echo " ey : use object equality (default)" echo " en : do not use object equality" echo "Usage for problem:" echo " $PROGRAM -p #victim [#seed]" echo " #victim : number of flood victims (>= 3)" echo " #seed : optional seed for random number generation" echo "Description:" echo " > The propositional ReliefWork represents a relief work in a flood affected area." echo " > Victims might need relief packs, shelter, or ambulance service." echo " > There are a relief camp, a patrol boat, a pickup boat and an ambulance boat." echo " > A victim may be known to the patrol team or another victim." echo " > The patrol boat attends every victim not previously attended." echo " > The patrol boat gives packs to, or calls the pickup or the ambulance boat for victims." echo " > The pickup boat picks shelterless victims and takes to the camp shelter." echo " > The ambulance boat takes victims needing emergency treatment to the camp hospital." echo return 2 } # generate the domain function domain { echo echo "(define" echo " (domain $DOMAIN)" echo " (:requirements" if [[ -z $EQUALITY || $EQUALITY == "ey" ]] then echo " :strips :typing :equality" else echo " :strips :typing" fi echo " )" echo " (:types" echo " victim boat pack seat" echo " )" echo " (:constants" echo " patrol pickup ambulance - boat" echo " camp - victim" # dummy victim echo " pack1 pack2 pack3 - pack" # the patrol boat can have only 3 packs on board echo " seat1 seat2 - seat" # the pickup boat has only two seats echo " )" echo " (:predicates" echo " (know-about ?v1 ?v2 - victim)" echo " (unattended ?v - victim)" echo " (attended ?v - victim)" echo " (need-reliefpack ?v - victim)" echo " (got-reliefpack ?v - victim)" echo " (need-ambulance ?v - victim)" echo " (ambulance-called ?v - victim)" echo " (on-ambulance ?v - victim)" echo " (hospitalized ?v - victim)" echo " (need-shelter ?v - victim)" echo " (pickup-called ?v - victim)" echo " (picked-up ?v - victim ?s - seat)" echo " (got-shelter ?v - victim)" echo " (boat-at ?b - boat ?v - victim)" echo " (reliefpack-full ?p - pack)" echo " (reliefpack-empty ?p - pack)" echo " (pickup-empty ?s - seat)" echo " (ambulance-empty)" echo " )" echo " (:action take-pack" echo " :parameters (?p - pack)" echo " :precondition" echo " (and" echo " (boat-at patrol camp)" echo " (reliefpack-empty ?p)" echo " )" echo " :effect" echo " (and" echo " (not (reliefpack-empty ?p))" echo " (reliefpack-full ?p)" echo " )" echo " )" echo " (:action inform-patrol" echo " :parameters (?v1 ?v2 - victim)" echo " :precondition" echo " (and" if [[ -z $EQUALITY || $EQUALITY == "ey" ]] then echo " (not (= ?v1 ?v2))" fi echo " (boat-at patrol ?v1)" echo " (know-about ?v1 ?v2)" echo " )" echo " :effect" echo " (and" echo " (not (know-about ?v1 ?v2))" echo " (unattended ?v2)" echo " )" echo " )" echo " (:action give-pack" echo " :parameters (?v - victim ?p - pack)" echo " :precondition" echo " (and" echo " (boat-at patrol ?v)" echo " (unattended ?v)" echo " (need-reliefpack ?v)" echo " (reliefpack-full ?p)" echo " )" echo " :effect" echo " (and" echo " (not (unattended ?v))" echo " (not (need-reliefpack ?v))" echo " (attended ?v)" echo " (got-reliefpack ?v)" echo " (not (reliefpack-full ?p))" echo " (reliefpack-empty ?p)" echo " )" echo " )" echo " (:action move-patrol" echo " :parameters (?v1 ?v2 - victim)" echo " :precondition" echo " (and" if [[ -z $EQUALITY || $EQUALITY == "ey" ]] then echo " (not (= ?v1 ?v2))" fi echo " (attended ?v1)" echo " (boat-at patrol ?v1)" echo " (unattended ?v2)" echo " )" echo " :effect" echo " (and" echo " (not (boat-at patrol ?v1))" echo " (boat-at patrol ?v2)" echo " )" echo " )" echo " (:action call-pickup" echo " :parameters (?v - victim)" echo " :precondition" echo " (and" echo " (boat-at patrol ?v)" echo " (unattended ?v)" echo " (need-shelter ?v)" echo " )" echo " :effect" echo " (and" echo " (not (unattended ?v))" echo " (not (need-shelter ?v))" echo " (attended ?v)" echo " (pickup-called ?v)" echo " )" echo " )" echo " (:action move-pickup" echo " :parameters (?v1 ?v2 - victim)" echo " :precondition" echo " (and" if [[ -z $EQUALITY || $EQUALITY == "ey" ]] then echo " (not (= ?v1 ?v2))" fi echo " (boat-at pickup ?v1)" echo " (pickup-called ?v2)" echo " )" echo " :effect" echo " (and" echo " (not (boat-at pickup ?v1))" echo " (boat-at pickup ?v2)" echo " )" echo " )" echo " (:action pickup-victim" echo " :parameters (?v - victim ?s - seat)" echo " :precondition" echo " (and" echo " (pickup-called ?v)" echo " (boat-at pickup ?v)" echo " (pickup-empty ?s)" echo " )" echo " :effect" echo " (and" echo " (not (pickup-called ?v))" echo " (not (pickup-empty ?s))" echo " (picked-up ?v ?s)" echo " )" echo " )" echo " (:action dropoff-victim" echo " :parameters (?v - victim ?s - seat)" echo " :precondition" echo " (and" echo " (picked-up ?v ?s)" echo " (boat-at pickup camp)" echo " )" echo " :effect" echo " (and" echo " (not (picked-up ?v ?s))" echo " (got-shelter ?v)" echo " (pickup-empty ?s)" echo " )" echo " )" echo " (:action call-ambulance" echo " :parameters (?v - victim)" echo " :precondition" echo " (and" echo " (boat-at patrol ?v)" echo " (unattended ?v)" echo " (need-ambulance ?v)" echo " )" echo " :effect" echo " (and" echo " (not (need-ambulance ?v))" echo " (ambulance-called ?v)" echo " )" echo " )" echo " (:action move-ambulance" echo " :parameters (?v1 ?v2 - victim)" echo " :precondition" echo " (and" if [[ -z $EQUALITY || $EQUALITY == "ey" ]] then echo " (not (= ?v1 ?v2))" fi echo " (boat-at ambulance ?v1)" echo " (ambulance-called ?v2)" echo " )" echo " :effect" echo " (and" echo " (not (boat-at ambulance ?v1))" echo " (boat-at ambulance ?v2)" echo " )" echo " )" echo " (:action receive-victim" echo " :parameters (?v - victim)" echo " :precondition" echo " (and" echo " (boat-at patrol ?v)" echo " (ambulance-called ?v)" echo " (boat-at ambulance ?v)" echo " (unattended ?v)" echo " (ambulance-empty)" echo " )" echo " :effect" echo " (and" echo " (not (ambulance-called ?v))" echo " (on-ambulance ?v)" echo " (not (unattended ?v))" echo " (attended ?v)" echo " (not (ambulance-empty))" echo " )" echo " )" echo " (:action hospitalize-victim" echo " :parameters (?v - victim)" echo " :precondition" echo " (and" echo " (boat-at ambulance camp)" echo " (on-ambulance ?v)" echo " )" echo " :effect" echo " (and" echo " (not (on-ambulance ?v))" echo " (hospitalized ?v)" echo " (ambulance-empty)" echo " )" echo " )" echo ")" echo return 0 } function problem { if (( SEED != 0 )) # if a seed is provided, use that then RANDOM=$SEED fi echo echo "(define" echo " (problem $DOMAIN-$VICTIM)" echo " (:domain $DOMAIN)" echo " (:objects" for (( i = 0; i < VICTIM; i++ )) do echo " v$i" # victims done echo " - victim" echo " )" echo " (:init" declare -i NEEDRELIEFPACK=0 declare -i NEEDSHELTER=0 declare -i NEEDAMBULANCE=0 declare -a VICTIMNEED for (( i = 0; i < VICTIM; i++ )) # distribute victims over the need categories do if (( RANDOM % 3 == 0)) then VICTIMNEED[$i]="ambulance" NEEDAMBULANCE=$((NEEDAMBULANCE + 1)) elif (( RANDOM % 2 == 0)) then VICTIMNEED[$i]="shelter" NEEDSHELTER=$((NEEDSHELTER + 1)) else VICTIMNEED[$i]="reliefpack" NEEDRELIEFPACK=$((NEEDRELIEFPACK + 1)) fi done while (( NEEDRELIEFPACK == 0 || NEEDSHELTER == 0 || NEEDAMBULANCE == 0 )) do # each need caterogy must have some victims j=$((RANDOM % VICTIM)) # select a random victim case ${VICTIMNEED[$j]} in # his category will be changed ("ambulance") NEEDAMBULANCE=$((NEEDAMBULANCE - 1)) ;; ("shelter") NEEDSHELTER=$((NEEDSHELTER - 1)) ;; ("needpack") NEEDRELIEFPACK=$((NEEDRELIEFPACK - 1)) ;; esac if [[ $NEEDAMBULANCE -eq 0 ]] # make this the category of the selected victim then VICTIMNEED[$j]="ambulance" NEEDAMBULANCE=$((NEEDAMBULANCE + 1)) elif [[ $NEEDSHELTER -eq 0 ]] # make this the category of the selected victim then VICTIMNEED[$j]="shelter" NEEDSHELTER=$((NEEDSHELTER + 1)) elif [[ $NEEDRELIEFPACK -eq 0 ]] # make this the category of the selected victim then VICTIMNEED[$j]="reliefpack" NEEDRELIEFPACK=$((NEEDRELIEFPACK + 1)) fi done for (( i = 0; i < VICTIM; i++ )) # pddl output do case ${VICTIMNEED[$i]} in ("ambulance") echo " (need-ambulance v$i)" ;; ("shelter") echo " (need-shelter v$i)" ;; ("reliefpack") echo " (need-reliefpack v$i)" ;; esac done declare -a KNOWNBY for (( i = 0; i < VICTIM; i++ )) # initially every body knows himself only do KNOWNBY[$i]=$i done for (( i = 0; i < VICTIM; i++ )) do if (( RANDOM % 3 != 0 )) # change a victims known-by to another victim who is not known to others then j=$(( RANDOM % VICTIM )) if [[ KNOWNBY[$j] -eq $j ]] then KNOWNBY[$i]=$j fi fi done for (( i = 0; i < VICTIM; i++ )) do if [[ ${KNOWNBY[$i]} -eq $i ]] then echo " (unattended v$i)" # a victim not known to others must raise his need himself else echo " (know-about v${KNOWNBY[$i]} v$i)" fi done echo " (reliefpack-empty pack1)" echo " (reliefpack-empty pack2)" echo " (reliefpack-empty pack3)" echo " (pickup-empty seat1)" echo " (pickup-empty seat2)" echo " (ambulance-empty)" echo " (boat-at patrol camp)" echo " (boat-at pickup camp)" echo " (boat-at ambulance camp)" echo " (unattended camp)" # to ensure move operations work echo " (attended camp)" # to ensure move operations work echo " (pickup-called camp)" # to ensure move operations work echo " (ambulance-called camp)" # to ensure move operations work echo " )" echo " (:goal" echo " (and" for (( i = 0; i < VICTIM; i++ )) do case ${VICTIMNEED[$i]} in ("ambulance") echo " (hospitalized v$i)" ;; ("shelter") echo " (got-shelter v$i)" ;; ("reliefpack") echo " (got-reliefpack v$i)" ;; esac done echo " )" echo " )" echo ")" echo return 0 } # main body if [[ $OPTION == "-p" ]] then declare -i VICTIM=$2 # number of places declare -i SEED=$3 # optional seed for random number generation if (( ($COUNT == 2 || $COUNT == 3) && $VICTIM >= 3)) then problem else echo echo " Error in parameter count or parameter values." echo explain fi elif [[ $OPTION == "-d" ]] then declare EQUALITY=$2 # optional equality (ey) no-equality (en) if [[ $COUNT -eq 1 || $COUNT -eq 2 && $EQUALITY == e[yn] ]] then domain else echo echo " Error in parameter count or parameter values." echo explain fi else explain fi exit $?