(deftemplate Time (slot tpoint)) (deftemplate EC (slot predicate) ;HoldsAt,ReleasedAt,Initiates,Terminates,Releases,UnconstraintedAt (slot event) (slot fluent) (slot time (default 0)) (slot reactivation (default 1)) ) (bind ?*Endtime* 2) ; ------------ ; Sort Object ; ------------ (deftemplate object (slot name)) (deffacts objects (object (name Book))) ; ------------ ; Sort Agent ; ------------ (deftemplate agent (slot name)) (deffacts agents (agent (name Nathan))) ; ------------ ; Sort Room ; ------------ (deftemplate room (slot name)) (deffacts rooms (room (name LivingRoom)) (room (name Kitchen))) ; ------------ ; Sort Fluents ; ------------ (deftemplate fluent (slot name) (multislot arg)) (defrule InRoom (declare (salience 590)) ?obj <- (or (object (name ?id1)) (agent (name ?id1))) ?room <- (room (name ?id2)) => (assert ( fluent (name InRoom) (arg ?id1 ?id2)))) (defrule Holding (declare (salience 590)) ?obj <- (object (name ?id2)) ?agent <- (agent (name ?id1)) => (assert ( fluent (name Holding) (arg ?id1 ?id2)))) ; ------------ ; Sort Events ; ------------ (deftemplate event (slot name) (multislot arg)) (defrule LetGoOf (declare (salience 590)) ?agent <- (agent (name ?id1)) ?obj <- (object (name ?id2)) => (assert ( event (name LetGoOf) (arg ?id1 ?id2)))) (defrule PickUp (declare (salience 590)) ?agent <- (agent (name ?id1)) ?obj <- (object (name ?id2)) => (assert ( event (name PickUp) (arg ?id1 ?id2)))) (defrule Walk (declare (salience 590)) ?agent <- (agent (name ?ag)) ?room1 <- (room (name ?r1)) ?room2 <- (room (name ?r2&:(neq ?r1 ?r2))) => (assert ( event (name Walk) (arg ?ag ?r1 ?r2)))) ; ------------ ; Domain Specifications ; ------------ (defrule MAIN::InitInRoom (declare (salience 570)) (Time (tpoint ?t)) ?event <- (event (name Walk) (arg $?ag $?r1 $?r2&:(and (neq (length$ $?r1) 0) (neq (length$ $?r2) 0)))) ?fluent <- (fluent (name InRoom) (arg $?ag $?r2)) (not (EC (predicate Initiates) (event ?event) (fluent ?fluent) (time ?t) )) => (assert (EC (predicate Initiates) (event ?event) (fluent ?fluent) (time ?t)))) (defrule MAIN::TermInRoom (declare (salience 570)) (Time (tpoint ?t)) ?event <- (event (name Walk) (arg $?ag $?r1 $?r2&:(and (neq (length$ $?r1) 0) (neq (length$ $?r2) 0)))) ?fluent <- (fluent (name InRoom) (arg $?ag $?r1)) (not (EC (predicate Terminates) (event ?event) (fluent ?fluent) (time ?t) )) => (assert (EC (predicate Terminates) (event ?event) (fluent ?fluent) (time ?t)))) (defrule MAIN::InitHolding (declare (salience 570)) (Time (tpoint ?t)) ?prec1 <- (fluent (name InRoom) (arg $?ag $?r1)) (EC (predicate HoldsAt) (fluent ?prec1) (time ?t)) ?prec2 <- (fluent (name InRoom) (arg $?obj $?r1)) (EC (predicate HoldsAt) (fluent ?prec2) (time ?t)) ?fluent <- (fluent (name Holding) (arg $?ag $?obj)) ?event <- (event (name PickUp) (arg $?ag $?obj)) (not (EC (predicate Initiates) (event ?event) (fluent ?fluent) (time ?t))) => (assert (EC (predicate Initiates) (event ?event) (fluent ?fluent) (time ?t)))) (defrule MAIN::TermHolding (declare (salience 570)) (Time (tpoint ?t)) (agent (name ?ag)) (object (name ?obj)) ?fluent <- (fluent (name Holding) (arg ?ag ?obj)) (EC (predicate HoldsAt) (fluent ?fluent) (time ?t)) ?event <- (event (name LetGoOf) (arg ?ag ?obj)) (not (EC (predicate Terminates) (event ?event) (fluent ?fluent) (time ?t))) => (assert (EC (predicate Terminates) (event ?event) (fluent ?fluent) (time ?t)))) (defrule MAIN::RelInRoom (declare (salience 570)) (Time (tpoint ?t)) (agent (name ?ag)) (object (name ?obj)) ?prec1 <- (fluent (name InRoom) (arg ?ag $?r1)) (EC (predicate HoldsAt) (fluent ?prec1) (time ?t)) ?fluent <- (fluent (name InRoom) (arg ?obj $?r1)) (EC (predicate HoldsAt) (fluent ?fluent) (time ?t)) ?event <- (event (name PickUp) (arg ?ag ?obj)) (not (EC (predicate Releases) (event ?event) (fluent ?fluent) (time ?t) )) => (assert (EC (predicate Releases) (event ?event) (fluent ?fluent) (time ?t)))) (defrule MAIN::InitInRoom2 (declare (salience 570)) (Time (tpoint ?t)) ?prec <- (fluent (name InRoom) (arg $?ag $?r)) ;To $?ag mporei na einai eite agent eite object. Na dw an dhmiourgei provlima (EC (predicate HoldsAt) (fluent ?prec) (time ?t)) ?fluent <- (fluent (name InRoom) (arg $?obj $?r)) ?event <- (event (name LetGoOf) (arg $?ag $?obj)) (not (EC (predicate Initiates) (event ?event) (fluent ?fluent) (time ?t))) => (assert (EC (predicate Initiates) (event ?event) (fluent ?fluent) (time ?t)))) (defrule Initial5StateConstraint (declare (salience 550)) (Time (tpoint ?t)) (agent (name ?agent)) (object (name ?object)) ?fluent1 <- (fluent (name Holding) (arg ?agent ?object)) (EC (predicate HoldsAt) (fluent ?fluent1) (time ?t) ) ?fluent2 <- (fluent (name InRoom) (arg ?agent $?room)) (EC (predicate HoldsAt) (fluent ?fluent2) (time ?t) ) ?fluent3 <- (fluent (name InRoom) (arg ?object $?room)) (not (EC (predicate HoldsAt) (fluent ?fluent3) (time ?t) )) => (assert (EC (predicate HoldsAt) (fluent ?fluent3) (time ?t) ))) (defrule Initial51StateConstraint (declare (salience 550)) (Time (tpoint ?t)) (agent (name ?agent)) (object (name ?object)) ?fluent1 <- (fluent (name Holding) (arg ?agent ?object)) (EC (predicate HoldsAt) (fluent ?fluent1) (time ?t) ) ?fluent2 <- (fluent (name InRoom) (arg ?agent $?room)) (EC (predicate HoldsAt) (fluent ?fluent2) (time ?t) ) ?fluent3 <- (fluent (name InRoom) (arg ?object $?room)) (not (EC (predicate ReleasedAt) (fluent ?fluent1) (time ?t) )) (not (EC (predicate ReleasedAt) (fluent ?fluent2) (time ?t) )) (not (EC (predicate ConstrainedAt) (fluent ?fluent3) (time ?t) )) => (assert (EC (predicate ConstrainedAt) (fluent ?fluent3) (time ?t) ))) /* Next is the implementation of the following constraint [object,room1,room2,time] HoldsAt(InRoom(object,room1),time) & HoldsAt(InRoom(object,room2),time) -> room1=room2. Of course we cannot write the constraint as before, instead we declare that all InRoom fluents about the object are not constrained, if the state constrainted is activated for one of the fluents. */ (defrule Initial6 (declare (salience 550)) (Time (tpoint ?t)) (object (name ?obj1)) ?fluent1 <- (fluent (name InRoom) (arg ?obj1 $?r1)) (EC (predicate ConstrainedAt) (fluent ?fluent1) (time ?t) ) ?fluent2 <- (fluent (name InRoom) (arg ?obj1 $?r2)) (not (EC (predicate ConstrainedAt) (fluent ?fluent2) (time ?t) )) => (assert (EC (predicate ConstrainedAt) (fluent ?fluent2) (time ?t) ))) ; ------------ ; Initial conditions ; ------------ (defrule MAIN::Initial1 (declare (salience 570)) (Time (tpoint ?t)) ?fluent <- (fluent (name InRoom) (arg Nathan LivingRoom)) (not (EC (predicate HoldsAt) (fluent ?fluent) (time 0) )) ;Eliminate dublicates due to reactivation => (assert (EC (predicate HoldsAt) (fluent ?fluent) (time 0) )) ) (defrule MAIN::Initial2 (declare (salience 570)) (Time (tpoint ?t)) ?fluent <- (fluent (name InRoom) (arg Book LivingRoom)) (not (EC (predicate HoldsAt) (fluent ?fluent) (time 0) )) ;Eliminate dublicates due to reactivation => (assert (EC (predicate HoldsAt) (fluent ?fluent) (time 0) )) ) (defrule MAIN::Initial3 (declare (salience 570)) (Time (tpoint ?t)) ?event <- (event (name PickUp) (arg Nathan Book)) (not (EC (predicate Happens) (event ?event) (time 0) )) ;Eliminate dublicates due to reactivation => (assert (EC (predicate Happens) (event ?event) (time 0) )) ) (defrule MAIN::Initial4 (declare (salience 570)) (Time (tpoint ?t)) ?event <- (event (name Walk) (arg Nathan LivingRoom Kitchen)) (not (EC (predicate Happens) (event ?event) (time 1) )) ;Eliminate dublicates due to reactivation => (assert (EC (predicate Happens) (event ?event) (time 1) )) ) /* (defrule MAIN::Initial7 (declare (salience 570)) (Time (tpoint ?t)) ?event <- (event (name LetGoOf) (arg Nathan Book)) (not (EC (predicate Happens) (event ?event) (time 2) )) ;Eliminate dublicates due to reactivation => (assert (EC (predicate Happens) (event ?event) (time 2) )) ) (defrule MAIN::Initial8 (declare (salience 570)) (Time (tpoint ?t)) ?event <- (event (name Walk) (arg Nathan Kitchen LivingRoom)) (not (EC (predicate Happens) (event ?event) (time 3) )) ;Eliminate dublicates due to reactivation => (assert (EC (predicate Happens) (event ?event) (time 3) )) ) */