;;; -*- Mode: Lisp; -*- Author: Peter Norvig

;;;; Knowledge-Based Agent

(defstructure (action-value-agent (:include agent)
				  (program (make-action-value-agent-program))))

(defun make-action-value-agent-program (&key (kb (make-fol-kb)))
  "Define an action-value knowledge-based agent. [p 210]"
  (let ((t 0))
    #'(lambda (percept)
	(tell kb `(Percept ,percept ,t))
	(let ((action (or (ask-pattern kb `(Great $a t) '$a)
			  (ask-pattern kb `(Good $a t) '$a)
			  (ask-pattern kb `(Medium $a t) '$a)
			  (ask-pattern kb `(Risky $a t) '$a))))
	  (tell kb `(Did Self ,action ,t))
	  (incf t)
	  action))))

; p 177