34 lines
1.2 KiB
Python
34 lines
1.2 KiB
Python
|
import copy
|
||
|
import logging
|
||
|
|
||
|
class Action:
|
||
|
|
||
|
def __init__(self, pos_precond, neg_precond, retracts, updates):
|
||
|
self.pos_precond = copy.deepcopy(pos_precond)
|
||
|
self.neg_precond = copy.deepcopy(neg_precond)
|
||
|
self.retracts = copy.deepcopy(retracts)
|
||
|
self.updates = copy.deepcopy(updates)
|
||
|
|
||
|
def satisfied(self, kb, subject, obj):
|
||
|
for fact in self.pos_precond:
|
||
|
if not kb.ask(kb.subst(fact, subject, obj)):
|
||
|
logging.warning('{} is not valid in the current knowledgebase'.format(fact))
|
||
|
return False
|
||
|
|
||
|
for fact in self.neg_precond:
|
||
|
if kb.ask(kb.subst(fact, subject, obj)):
|
||
|
logging.warning('{} is valid in the current knowledgebase'.format(fact))
|
||
|
return False
|
||
|
return True
|
||
|
|
||
|
def perform(self, kb, subject, obj):
|
||
|
if not self.satisfied(kb, subject, obj):
|
||
|
return None
|
||
|
kbprime = copy.deepcopy(kb)
|
||
|
for retraction in self.retracts:
|
||
|
kbprime.retract(kb.subst(retraction, subject, obj))
|
||
|
for update in self.updates:
|
||
|
kbprime.tell(kb.subst(update, subject, obj))
|
||
|
return kbprime
|
||
|
|