#! /bin/bash ############################################################################# # Numerical Measurement 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" echo "Usage for problem:" echo " $PROGRAM -p #client [#seed]" echo " #client : number of clients" echo " #seed : optional seed for random number generation" echo "Description:" echo " > The numerical Measurement represents a confectionery that is to serve clients." echo " > To measure liquid, the salesman has two flasks that measure only 4 and 7" echo " > To measure solid, the salesman has only three weights of 1, 3 and 9" echo " > But he can some how measure any quantity of cakes and cokes." echo return 2 } # generate the domain function domain { echo echo "(define" echo " (domain $DOMAIN)" echo " (:requirements" echo " :typing :fluents" echo " )" echo " (:types" echo " flask client weight" echo " )" echo " (:constants" echo " one three nine - weight" echo " four seven - flask" echo " )" echo " (:functions" echo " (contains ?f - flask)" echo " (thirsty ?c - client)" echo " (weighs ?w - weight)" echo " (hungry ?c - client)" echo " (scale-value)" echo " )" echo " (:action do-empty-four" echo " :parameters ()" echo " :precondition" echo " (and" echo " (> (contains four) 0)" echo " )" echo " :effect" echo " (and" echo " (assign (contains four) 0)" echo " )" echo " )" echo " (:action do-empty-seven" echo " :parameters ()" echo " :precondition" echo " (and" echo " (> (contains seven) 0)" echo " )" echo " :effect" echo " (and" echo " (assign (contains seven) 0)" echo " )" echo " )" echo " (:action do-fill-four" echo " :parameters ()" echo " :precondition" echo " (and" echo " (< (contains four) 4)" echo " )" echo " :effect" echo " (and" echo " (assign (contains four) 4)" echo " )" echo " )" echo " (:action do-fill-seven" echo " :parameters ()" echo " :precondition" echo " (and" echo " (< (contains seven) 7)" echo " )" echo " :effect" echo " (and" echo " (assign (contains seven) 7)" echo " )" echo " )" echo " (:action four-fill-seven" echo " :parameters ()" echo " :precondition" echo " (and" echo " (> (+ (contains four) (contains seven)) 7)" echo " )" echo " :effect" echo " (and" echo " (decrease (contains four) (- 7 (contains seven)))" echo " (assign (contains seven) 7)" echo " )" echo " )" echo " (:action seven-fill-four" echo " :parameters ()" echo " :precondition" echo " (and" echo " (> (+ (contains seven) (contains four)) 4)" echo " )" echo " :effect" echo " (and" echo " (decrease (contains seven) (- 4 (contains four)))" echo " (assign (contains four) 4)" echo " )" echo " )" echo " (:action empty-seven-four" echo " :parameters ()" echo " :precondition" echo " (and" echo " (> (contains seven) 0)" echo " (< (+ (contains seven) (contains four)) 4)" echo " )" echo " :effect" echo " (and" echo " (increase (contains four) (contains seven))" echo " (assign (contains seven) 0)" echo " )" echo " )" echo " (:action empty-four-seven" echo " :parameters ()" echo " :precondition" echo " (and" echo " (> (contains four) 0)" echo " (< (+ (contains seven) (contains four)) 7)" echo " )" echo " :effect" echo " (and" echo " (increase (contains seven) (contains four))" echo " (assign (contains four) 0)" echo " )" echo " )" echo " (:action deliver-seven" echo " :parameters (?c - client)" echo " :precondition" echo " (and" echo " (> (contains seven) 0)" echo " (>= (thirsty ?c) (contains seven))" echo " )" echo " :effect" echo " (and" echo " (assign (contains seven) 0)" echo " (decrease (thirsty ?c) (contains seven))" echo " )" echo " )" echo " (:action deliver-four" echo " :parameters (?c - client)" echo " :precondition" echo " (and" echo " (> (contains four) 0)" echo " (>= (thirsty ?c) (contains four))" echo " )" echo " :effect" echo " (and" echo " (assign (contains four) 0)" echo " (decrease (thirsty ?c) (contains four))" echo " )" echo " )" echo " (:action plus-put-one" echo " :parameters ()" echo " :precondition" echo " (and" echo " (= (weighs one) 0)" echo " )" echo " :effect" echo " (and" echo " (increase (weighs one) 1)" echo " (increase (scale-value) 1)" echo " )" echo " )" echo " (:action plus-put-three" echo " :parameters ()" echo " :precondition" echo " (and" echo " (= (weighs three) 0)" echo " )" echo " :effect" echo " (and" echo " (increase (weighs three) 3)" echo " (increase (scale-value) 3)" echo " )" echo " )" echo " (:action plus-put-nine" echo " :parameters ()" echo " :precondition" echo " (and" echo " (= (weighs nine) 0)" echo " )" echo " :effect" echo " (and" echo " (increase (weighs nine) 9)" echo " (increase (scale-value) 9)" echo " )" echo " )" echo " (:action minus-put-one" echo " :parameters ()" echo " :precondition" echo " (and" echo " (= (weighs one) 0)" echo " )" echo " :effect" echo " (and" echo " (decrease (weighs one) 1)" echo " (decrease (scale-value) 1)" echo " )" echo " )" echo " (:action minus-put-three" echo " :parameters ()" echo " :precondition" echo " (and" echo " (= (weighs three) 0)" echo " )" echo " :effect" echo " (and" echo " (decrease (weighs three) 3)" echo " (decrease (scale-value) 3)" echo " )" echo " )" echo " (:action minus-put-nine" echo " :parameters ()" echo " :precondition" echo " (and" echo " (= (weighs nine) 0)" echo " )" echo " :effect" echo " (and" echo " (decrease (weighs nine) 9)" echo " (decrease (scale-value) 9)" echo " )" echo " )" echo " (:action plus-take-one" echo " :parameters ()" echo " :precondition" echo " (and" echo " (> (weighs one) 0)" echo " )" echo " :effect" echo " (and" echo " (decrease (weighs one) 1)" echo " (decrease (scale-value) 1)" echo " )" echo " )" echo " (:action plus-take-three" echo " :parameters ()" echo " :precondition" echo " (and" echo " (> (weighs three) 0)" echo " )" echo " :effect" echo " (and" echo " (decrease (weighs three) 3)" echo " (decrease (scale-value) 3)" echo " )" echo " )" echo " (:action plus-take-nine" echo " :parameters ()" echo " :precondition" echo " (and" echo " (> (weighs nine) 0)" echo " )" echo " :effect" echo " (and" echo " (decrease (weighs nine) 9)" echo " (decrease (scale-value) 9)" echo " )" echo " )" echo " (:action minus-take-one" echo " :parameters ()" echo " :precondition" echo " (and" echo " (< (weighs one) 0)" echo " )" echo " :effect" echo " (and" echo " (increase (weighs one) 1)" echo " (increase (scale-value) 1)" echo " )" echo " )" echo " (:action minus-take-three" echo " :parameters ()" echo " :precondition" echo " (and" echo " (< (weighs three) 0)" echo " )" echo " :effect" echo " (and" echo " (increase (weighs three) 3)" echo " (increase (scale-value) 3)" echo " )" echo " )" echo " (:action minus-take-nine" echo " :parameters ()" echo " :precondition" echo " (and" echo " (< (weighs nine) 0)" echo " )" echo " :effect" echo " (and" echo " (increase (weighs nine) 9)" echo " (increase (scale-value) 9)" echo " )" echo " )" echo " (:action deliver-scale" echo " :parameters (?c - client)" echo " :precondition" echo " (and" echo " (> (scale-value) 0)" echo " (>= (hungry ?c) (scale-value))" echo " )" echo " :effect" echo " (and" echo " (decrease (hungry ?c) (scale-value))" echo " )" echo " )" echo ")" echo return 0 } function problem { if (( SEED != 0 )) # if a seed is given, use that then RANDOM=$SEED fi echo echo "(define" echo " (problem $DOMAIN-$CLIENT)" echo " (:domain $DOMAIN)" echo " (:objects" for (( i = 0; i < CLIENT; i++ )) do echo " c$i" # clients done echo " - client" echo " )" echo " (:init" echo " (= (contains four) 0)" echo " (= (contains seven) 0)" echo " (= (weighs one) 0)" echo " (= (weighs three) 0)" echo " (= (weighs nine) 0)" echo " (= (scale-value) 0)" for (( i = 0; i < CLIENT; i++ )) do echo " (= (thirsty c$i) $((RANDOM % 11 + 1)))" echo " (= (hungry c$i) $((RANDOM % 13 + 1)))" done echo " )" echo " (:goal" echo " (and" for (( i = 0; i < CLIENT; i++ )) do echo " (= (thirsty c$i) 0)" echo " (= (hungry c$i) 0)" done echo " )" echo " )" echo ")" echo return 0 } # main body if [[ $OPTION == "-p" ]] then declare -i CLIENT=$2 # number of places declare -i SEED=$3 # optional seed for random number generation if (( ($COUNT == 2 || $COUNT == 3) && $CLIENT >= 1)) then problem else echo echo " Error in parameter count or parameter values." echo explain fi elif [[ $OPTION == "-d" ]] then if [[ $COUNT -eq 1 ]] then domain else echo echo " Error in parameter count or parameter values." echo explain fi else explain fi exit $?