802872f9505a

Add AIPS Rovers example
[view raw] [browse files]
author Steve Losh <steve@stevelosh.com>
date Thu, 30 Jun 2016 17:53:49 +0000
parents 4520c6449f48
children d255816ad1d0
branches/tags (none)
files examples/ggp-wam-rover.lisp

Changes

--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/examples/ggp-wam-rover.lisp	Thu Jun 30 17:53:49 2016 +0000
@@ -0,0 +1,630 @@
+(in-package #:bones.wam)
+
+(declaim (optimize (speed 3) (debug 0) (safety 0)))
+
+(defparameter *d* (make-database))
+
+(with-database *d*
+  (rules ((member :thing (list* :thing :rest)))
+         ((member :thing (list* :other :rest))
+          (member :thing :rest)))
+
+  (rule (true :state :thing)
+    (member :thing :state))
+
+  (rule (does :performed :role :move)
+    (member (does :role :move) :performed))
+
+  (rules ((not :x) (call :x) ! fail)
+         ((not :x)))
+
+  (fact (role solver))
+
+  (facts (init (thing empty_rover0store))
+         (init (thing available_rover0))
+         (init (thing at_rover0_waypoint3))
+         (init (thing channel_free_general))
+         (init (thing at_rock_sample_waypoint3))
+         (init (thing at_soil_sample_waypoint3))
+         (init (thing at_rock_sample_waypoint2))
+         (init (thing at_soil_sample_waypoint2))
+         (init (thing at_rock_sample_waypoint1))
+         (init (thing at_soil_sample_waypoint0))
+         (init (step num1)))
+
+  (rule (solved :state)
+    (true :state (thing communicated_image_data_objective1_high_res))
+    (true :state (thing communicated_rock_data_waypoint3))
+    (true :state (thing communicated_soil_data_waypoint2)))
+
+  (rules ((terminal :state)
+          (true :state (thing communicated_image_data_objective1_high_res))
+          (true :state (thing communicated_rock_data_waypoint3))
+          (true :state (thing communicated_soil_data_waypoint2)))
+         ((terminal :state)
+          (true :state (step num30))))
+
+  (rules
+    ((goal :state solver num100)
+     (true :state (thing communicated_image_data_objective1_high_res))
+     (true :state (thing communicated_rock_data_waypoint3))
+     (true :state (thing communicated_soil_data_waypoint2)))
+    ((goal :state solver num0)
+     (not (solved :state))))
+
+  (rules ((legal :state solver navigate_rover0_waypoint0_waypoint3)
+          (true :state (thing at_rover0_waypoint0))
+          (true :state (thing available_rover0)))
+         ((legal :state solver navigate_rover0_waypoint1_waypoint3)
+          (true :state (thing at_rover0_waypoint1))
+          (true :state (thing available_rover0)))
+         ((legal :state solver communicate_image_data_rover0_general_objective1_high_res_waypoint1_waypoint0)
+          (true :state (thing channel_free_general))
+          (true :state (thing available_rover0))
+          (true :state (thing have_image_rover0_objective1_high_res))
+          (true :state (thing at_rover0_waypoint1)))
+         ((legal :state solver communicate_image_data_rover0_general_objective1_colour_waypoint1_waypoint0)
+          (true :state (thing channel_free_general))
+          (true :state (thing available_rover0))
+          (true :state (thing have_image_rover0_objective1_colour))
+          (true :state (thing at_rover0_waypoint1)))
+         ((legal :state solver communicate_image_data_rover0_general_objective0_high_res_waypoint1_waypoint0)
+          (true :state (thing channel_free_general))
+          (true :state (thing available_rover0))
+          (true :state (thing have_image_rover0_objective0_high_res))
+          (true :state (thing at_rover0_waypoint1)))
+         ((legal :state solver communicate_image_data_rover0_general_objective0_colour_waypoint1_waypoint0)
+          (true :state (thing channel_free_general))
+          (true :state (thing available_rover0))
+          (true :state (thing have_image_rover0_objective0_colour))
+          (true :state (thing at_rover0_waypoint1)))
+         ((legal :state solver communicate_image_data_rover0_general_objective1_high_res_waypoint2_waypoint0)
+          (true :state (thing channel_free_general))
+          (true :state (thing available_rover0))
+          (true :state (thing have_image_rover0_objective1_high_res))
+          (true :state (thing at_rover0_waypoint2)))
+         ((legal :state solver communicate_image_data_rover0_general_objective1_colour_waypoint2_waypoint0)
+          (true :state (thing channel_free_general))
+          (true :state (thing available_rover0))
+          (true :state (thing have_image_rover0_objective1_colour))
+          (true :state (thing at_rover0_waypoint2)))
+         ((legal :state solver communicate_image_data_rover0_general_objective0_high_res_waypoint2_waypoint0)
+          (true :state (thing channel_free_general))
+          (true :state (thing available_rover0))
+          (true :state (thing have_image_rover0_objective0_high_res))
+          (true :state (thing at_rover0_waypoint2)))
+         ((legal :state solver communicate_image_data_rover0_general_objective0_colour_waypoint2_waypoint0)
+          (true :state (thing channel_free_general))
+          (true :state (thing available_rover0))
+          (true :state (thing have_image_rover0_objective0_colour))
+          (true :state (thing at_rover0_waypoint2)))
+         ((legal :state solver communicate_image_data_rover0_general_objective1_high_res_waypoint3_waypoint0)
+          (true :state (thing channel_free_general))
+          (true :state (thing available_rover0))
+          (true :state (thing have_image_rover0_objective1_high_res))
+          (true :state (thing at_rover0_waypoint3)))
+         ((legal :state solver communicate_image_data_rover0_general_objective1_colour_waypoint3_waypoint0)
+          (true :state (thing channel_free_general))
+          (true :state (thing available_rover0))
+          (true :state (thing have_image_rover0_objective1_colour))
+          (true :state (thing at_rover0_waypoint3)))
+         ((legal :state solver communicate_image_data_rover0_general_objective0_high_res_waypoint3_waypoint0)
+          (true :state (thing channel_free_general))
+          (true :state (thing available_rover0))
+          (true :state (thing have_image_rover0_objective0_high_res))
+          (true :state (thing at_rover0_waypoint3)))
+         ((legal :state solver communicate_image_data_rover0_general_objective0_colour_waypoint3_waypoint0)
+          (true :state (thing channel_free_general))
+          (true :state (thing available_rover0))
+          (true :state (thing have_image_rover0_objective0_colour))
+          (true :state (thing at_rover0_waypoint3)))
+         ((legal :state solver communicate_rock_data_rover0_general_waypoint3_waypoint1_waypoint0)
+          (true :state (thing channel_free_general))
+          (true :state (thing available_rover0))
+          (true :state (thing have_rock_analysis_rover0_waypoint3))
+          (true :state (thing at_rover0_waypoint1)))
+         ((legal :state solver communicate_rock_data_rover0_general_waypoint2_waypoint1_waypoint0)
+          (true :state (thing channel_free_general))
+          (true :state (thing available_rover0))
+          (true :state (thing have_rock_analysis_rover0_waypoint2))
+          (true :state (thing at_rover0_waypoint1)))
+         ((legal :state solver communicate_rock_data_rover0_general_waypoint1_waypoint1_waypoint0)
+          (true :state (thing channel_free_general))
+          (true :state (thing available_rover0))
+          (true :state (thing have_rock_analysis_rover0_waypoint1))
+          (true :state (thing at_rover0_waypoint1)))
+         ((legal :state solver communicate_rock_data_rover0_general_waypoint3_waypoint2_waypoint0)
+          (true :state (thing channel_free_general))
+          (true :state (thing available_rover0))
+          (true :state (thing have_rock_analysis_rover0_waypoint3))
+          (true :state (thing at_rover0_waypoint2)))
+         ((legal :state solver communicate_rock_data_rover0_general_waypoint2_waypoint2_waypoint0)
+          (true :state (thing channel_free_general))
+          (true :state (thing available_rover0))
+          (true :state (thing have_rock_analysis_rover0_waypoint2))
+          (true :state (thing at_rover0_waypoint2)))
+         ((legal :state solver communicate_rock_data_rover0_general_waypoint1_waypoint2_waypoint0)
+          (true :state (thing channel_free_general))
+          (true :state (thing available_rover0))
+          (true :state (thing have_rock_analysis_rover0_waypoint1))
+          (true :state (thing at_rover0_waypoint2)))
+         ((legal :state solver communicate_rock_data_rover0_general_waypoint3_waypoint3_waypoint0)
+          (true :state (thing channel_free_general))
+          (true :state (thing available_rover0))
+          (true :state (thing have_rock_analysis_rover0_waypoint3))
+          (true :state (thing at_rover0_waypoint3)))
+         ((legal :state solver communicate_rock_data_rover0_general_waypoint2_waypoint3_waypoint0)
+          (true :state (thing channel_free_general))
+          (true :state (thing available_rover0))
+          (true :state (thing have_rock_analysis_rover0_waypoint2))
+          (true :state (thing at_rover0_waypoint3)))
+         ((legal :state solver communicate_rock_data_rover0_general_waypoint1_waypoint3_waypoint0)
+          (true :state (thing channel_free_general))
+          (true :state (thing available_rover0))
+          (true :state (thing have_rock_analysis_rover0_waypoint1))
+          (true :state (thing at_rover0_waypoint3)))
+         ((legal :state solver communicate_soil_data_rover0_general_waypoint3_waypoint1_waypoint0)
+          (true :state (thing channel_free_general))
+          (true :state (thing available_rover0))
+          (true :state (thing have_soil_analysis_rover0_waypoint3))
+          (true :state (thing at_rover0_waypoint1)))
+         ((legal :state solver communicate_soil_data_rover0_general_waypoint2_waypoint1_waypoint0)
+          (true :state (thing channel_free_general))
+          (true :state (thing available_rover0))
+          (true :state (thing have_soil_analysis_rover0_waypoint2))
+          (true :state (thing at_rover0_waypoint1)))
+         ((legal :state solver communicate_soil_data_rover0_general_waypoint0_waypoint1_waypoint0)
+          (true :state (thing channel_free_general))
+          (true :state (thing available_rover0))
+          (true :state (thing have_soil_analysis_rover0_waypoint0))
+          (true :state (thing at_rover0_waypoint1)))
+         ((legal :state solver communicate_soil_data_rover0_general_waypoint3_waypoint2_waypoint0)
+          (true :state (thing channel_free_general))
+          (true :state (thing available_rover0))
+          (true :state (thing have_soil_analysis_rover0_waypoint3))
+          (true :state (thing at_rover0_waypoint2)))
+         ((legal :state solver communicate_soil_data_rover0_general_waypoint2_waypoint2_waypoint0)
+          (true :state (thing channel_free_general))
+          (true :state (thing available_rover0))
+          (true :state (thing have_soil_analysis_rover0_waypoint2))
+          (true :state (thing at_rover0_waypoint2)))
+         ((legal :state solver communicate_soil_data_rover0_general_waypoint0_waypoint2_waypoint0)
+          (true :state (thing channel_free_general))
+          (true :state (thing available_rover0))
+          (true :state (thing have_soil_analysis_rover0_waypoint0))
+          (true :state (thing at_rover0_waypoint2)))
+         ((legal :state solver communicate_soil_data_rover0_general_waypoint3_waypoint3_waypoint0)
+          (true :state (thing channel_free_general))
+          (true :state (thing available_rover0))
+          (true :state (thing have_soil_analysis_rover0_waypoint3))
+          (true :state (thing at_rover0_waypoint3)))
+         ((legal :state solver communicate_soil_data_rover0_general_waypoint2_waypoint3_waypoint0)
+          (true :state (thing channel_free_general))
+          (true :state (thing available_rover0))
+          (true :state (thing have_soil_analysis_rover0_waypoint2))
+          (true :state (thing at_rover0_waypoint3)))
+         ((legal :state solver communicate_soil_data_rover0_general_waypoint0_waypoint3_waypoint0)
+          (true :state (thing channel_free_general))
+          (true :state (thing available_rover0))
+          (true :state (thing have_soil_analysis_rover0_waypoint0))
+          (true :state (thing at_rover0_waypoint3)))
+         ((legal :state solver take_image_rover0_waypoint0_objective0_camera0_colour)
+          (true :state (thing at_rover0_waypoint0))
+          (true :state (thing calibrated_camera0_rover0)))
+         ((legal :state solver take_image_rover0_waypoint0_objective0_camera0_high_res)
+          (true :state (thing at_rover0_waypoint0))
+          (true :state (thing calibrated_camera0_rover0)))
+         ((legal :state solver take_image_rover0_waypoint1_objective0_camera0_colour)
+          (true :state (thing at_rover0_waypoint1))
+          (true :state (thing calibrated_camera0_rover0)))
+         ((legal :state solver take_image_rover0_waypoint1_objective0_camera0_high_res)
+          (true :state (thing at_rover0_waypoint1))
+          (true :state (thing calibrated_camera0_rover0)))
+         ((legal :state solver take_image_rover0_waypoint2_objective0_camera0_colour)
+          (true :state (thing at_rover0_waypoint2))
+          (true :state (thing calibrated_camera0_rover0)))
+         ((legal :state solver take_image_rover0_waypoint2_objective0_camera0_high_res)
+          (true :state (thing at_rover0_waypoint2))
+          (true :state (thing calibrated_camera0_rover0)))
+         ((legal :state solver take_image_rover0_waypoint3_objective0_camera0_colour)
+          (true :state (thing at_rover0_waypoint3))
+          (true :state (thing calibrated_camera0_rover0)))
+         ((legal :state solver take_image_rover0_waypoint3_objective0_camera0_high_res)
+          (true :state (thing at_rover0_waypoint3))
+          (true :state (thing calibrated_camera0_rover0)))
+         ((legal :state solver take_image_rover0_waypoint0_objective1_camera0_colour)
+          (true :state (thing at_rover0_waypoint0))
+          (true :state (thing calibrated_camera0_rover0)))
+         ((legal :state solver take_image_rover0_waypoint0_objective1_camera0_high_res)
+          (true :state (thing at_rover0_waypoint0))
+          (true :state (thing calibrated_camera0_rover0)))
+         ((legal :state solver take_image_rover0_waypoint1_objective1_camera0_colour)
+          (true :state (thing at_rover0_waypoint1))
+          (true :state (thing calibrated_camera0_rover0)))
+         ((legal :state solver take_image_rover0_waypoint1_objective1_camera0_high_res)
+          (true :state (thing at_rover0_waypoint1))
+          (true :state (thing calibrated_camera0_rover0)))
+         ((legal :state solver take_image_rover0_waypoint2_objective1_camera0_colour)
+          (true :state (thing at_rover0_waypoint2))
+          (true :state (thing calibrated_camera0_rover0)))
+         ((legal :state solver take_image_rover0_waypoint2_objective1_camera0_high_res)
+          (true :state (thing at_rover0_waypoint2))
+          (true :state (thing calibrated_camera0_rover0)))
+         ((legal :state solver take_image_rover0_waypoint3_objective1_camera0_colour)
+          (true :state (thing at_rover0_waypoint3))
+          (true :state (thing calibrated_camera0_rover0)))
+         ((legal :state solver take_image_rover0_waypoint3_objective1_camera0_high_res)
+          (true :state (thing at_rover0_waypoint3))
+          (true :state (thing calibrated_camera0_rover0)))
+         ((legal :state solver calibrate_rover0_camera0_objective1_waypoint0)
+          (true :state (thing at_rover0_waypoint0)))
+         ((legal :state solver calibrate_rover0_camera0_objective1_waypoint1)
+          (true :state (thing at_rover0_waypoint1)))
+         ((legal :state solver calibrate_rover0_camera0_objective1_waypoint2)
+          (true :state (thing at_rover0_waypoint2)))
+         ((legal :state solver calibrate_rover0_camera0_objective1_waypoint3)
+          (true :state (thing at_rover0_waypoint3)))
+         ((legal :state solver drop_rover0_rover0store)
+          (true :state (thing full_rover0store)))
+         ((legal :state solver sample_rock_rover0_rover0store_waypoint3)
+          (true :state (thing empty_rover0store))
+          (true :state (thing at_rock_sample_waypoint3))
+          (true :state (thing at_rover0_waypoint3)))
+         ((legal :state solver sample_rock_rover0_rover0store_waypoint2)
+          (true :state (thing empty_rover0store))
+          (true :state (thing at_rock_sample_waypoint2))
+          (true :state (thing at_rover0_waypoint2)))
+         ((legal :state solver sample_rock_rover0_rover0store_waypoint1)
+          (true :state (thing empty_rover0store))
+          (true :state (thing at_rock_sample_waypoint1))
+          (true :state (thing at_rover0_waypoint1)))
+         ((legal :state solver sample_soil_rover0_rover0store_waypoint3)
+          (true :state (thing empty_rover0store))
+          (true :state (thing at_soil_sample_waypoint3))
+          (true :state (thing at_rover0_waypoint3)))
+         ((legal :state solver sample_soil_rover0_rover0store_waypoint2)
+          (true :state (thing empty_rover0store))
+          (true :state (thing at_soil_sample_waypoint2))
+          (true :state (thing at_rover0_waypoint2)))
+         ((legal :state solver sample_soil_rover0_rover0store_waypoint0)
+          (true :state (thing empty_rover0store))
+          (true :state (thing at_soil_sample_waypoint0))
+          (true :state (thing at_rover0_waypoint0)))
+         ((legal :state solver navigate_rover0_waypoint2_waypoint1)
+          (true :state (thing at_rover0_waypoint2))
+          (true :state (thing available_rover0)))
+         ((legal :state solver navigate_rover0_waypoint1_waypoint2)
+          (true :state (thing at_rover0_waypoint1))
+          (true :state (thing available_rover0)))
+         ((legal :state solver navigate_rover0_waypoint3_waypoint0)
+          (true :state (thing at_rover0_waypoint3))
+          (true :state (thing available_rover0)))
+         ((legal :state solver navigate_rover0_waypoint3_waypoint1)
+          (true :state (thing at_rover0_waypoint3))
+          (true :state (thing available_rover0)))
+         ((legal :state solver noop)))
+
+
+  (facts (addeffect calibrate_rover0_camera0_objective1_waypoint0 (thing calibrated_camera0_rover0))
+         (addeffect calibrate_rover0_camera0_objective1_waypoint1 (thing calibrated_camera0_rover0))
+         (addeffect calibrate_rover0_camera0_objective1_waypoint2 (thing calibrated_camera0_rover0))
+         (addeffect calibrate_rover0_camera0_objective1_waypoint3 (thing calibrated_camera0_rover0))
+         (addeffect communicate_image_data_rover0_general_objective0_colour_waypoint1_waypoint0 (thing available_rover0))
+         (addeffect communicate_image_data_rover0_general_objective0_colour_waypoint1_waypoint0 (thing channel_free_general))
+         (addeffect communicate_image_data_rover0_general_objective0_colour_waypoint1_waypoint0 (thing communicated_image_data_objective0_colour))
+         (addeffect communicate_image_data_rover0_general_objective0_colour_waypoint2_waypoint0 (thing available_rover0))
+         (addeffect communicate_image_data_rover0_general_objective0_colour_waypoint2_waypoint0 (thing channel_free_general))
+         (addeffect communicate_image_data_rover0_general_objective0_colour_waypoint2_waypoint0 (thing communicated_image_data_objective0_colour))
+         (addeffect communicate_image_data_rover0_general_objective0_colour_waypoint3_waypoint0 (thing available_rover0))
+         (addeffect communicate_image_data_rover0_general_objective0_colour_waypoint3_waypoint0 (thing channel_free_general))
+         (addeffect communicate_image_data_rover0_general_objective0_colour_waypoint3_waypoint0 (thing communicated_image_data_objective0_colour))
+         (addeffect communicate_image_data_rover0_general_objective0_high_res_waypoint1_waypoint0 (thing available_rover0))
+         (addeffect communicate_image_data_rover0_general_objective0_high_res_waypoint1_waypoint0 (thing channel_free_general))
+         (addeffect communicate_image_data_rover0_general_objective0_high_res_waypoint1_waypoint0 (thing communicated_image_data_objective0_high_res))
+         (addeffect communicate_image_data_rover0_general_objective0_high_res_waypoint2_waypoint0 (thing available_rover0))
+         (addeffect communicate_image_data_rover0_general_objective0_high_res_waypoint2_waypoint0 (thing channel_free_general))
+         (addeffect communicate_image_data_rover0_general_objective0_high_res_waypoint2_waypoint0 (thing communicated_image_data_objective0_high_res))
+         (addeffect communicate_image_data_rover0_general_objective0_high_res_waypoint3_waypoint0 (thing available_rover0))
+         (addeffect communicate_image_data_rover0_general_objective0_high_res_waypoint3_waypoint0 (thing channel_free_general))
+         (addeffect communicate_image_data_rover0_general_objective0_high_res_waypoint3_waypoint0 (thing communicated_image_data_objective0_high_res))
+         (addeffect communicate_image_data_rover0_general_objective1_colour_waypoint1_waypoint0 (thing available_rover0))
+         (addeffect communicate_image_data_rover0_general_objective1_colour_waypoint1_waypoint0 (thing channel_free_general))
+         (addeffect communicate_image_data_rover0_general_objective1_colour_waypoint1_waypoint0 (thing communicated_image_data_objective1_colour))
+         (addeffect communicate_image_data_rover0_general_objective1_colour_waypoint2_waypoint0 (thing available_rover0))
+         (addeffect communicate_image_data_rover0_general_objective1_colour_waypoint2_waypoint0 (thing channel_free_general))
+         (addeffect communicate_image_data_rover0_general_objective1_colour_waypoint2_waypoint0 (thing communicated_image_data_objective1_colour))
+         (addeffect communicate_image_data_rover0_general_objective1_colour_waypoint3_waypoint0 (thing available_rover0))
+         (addeffect communicate_image_data_rover0_general_objective1_colour_waypoint3_waypoint0 (thing channel_free_general))
+         (addeffect communicate_image_data_rover0_general_objective1_colour_waypoint3_waypoint0 (thing communicated_image_data_objective1_colour))
+         (addeffect communicate_image_data_rover0_general_objective1_high_res_waypoint1_waypoint0 (thing available_rover0))
+         (addeffect communicate_image_data_rover0_general_objective1_high_res_waypoint1_waypoint0 (thing channel_free_general))
+         (addeffect communicate_image_data_rover0_general_objective1_high_res_waypoint1_waypoint0 (thing communicated_image_data_objective1_high_res))
+         (addeffect communicate_image_data_rover0_general_objective1_high_res_waypoint2_waypoint0 (thing available_rover0))
+         (addeffect communicate_image_data_rover0_general_objective1_high_res_waypoint2_waypoint0 (thing channel_free_general))
+         (addeffect communicate_image_data_rover0_general_objective1_high_res_waypoint2_waypoint0 (thing communicated_image_data_objective1_high_res))
+         (addeffect communicate_image_data_rover0_general_objective1_high_res_waypoint3_waypoint0 (thing available_rover0))
+         (addeffect communicate_image_data_rover0_general_objective1_high_res_waypoint3_waypoint0 (thing channel_free_general))
+         (addeffect communicate_image_data_rover0_general_objective1_high_res_waypoint3_waypoint0 (thing communicated_image_data_objective1_high_res))
+         (addeffect communicate_rock_data_rover0_general_waypoint1_waypoint1_waypoint0 (thing available_rover0))
+         (addeffect communicate_rock_data_rover0_general_waypoint1_waypoint1_waypoint0 (thing channel_free_general))
+         (addeffect communicate_rock_data_rover0_general_waypoint1_waypoint1_waypoint0 (thing communicated_rock_data_waypoint1))
+         (addeffect communicate_rock_data_rover0_general_waypoint1_waypoint2_waypoint0 (thing available_rover0))
+         (addeffect communicate_rock_data_rover0_general_waypoint1_waypoint2_waypoint0 (thing channel_free_general))
+         (addeffect communicate_rock_data_rover0_general_waypoint1_waypoint2_waypoint0 (thing communicated_rock_data_waypoint1))
+         (addeffect communicate_rock_data_rover0_general_waypoint1_waypoint3_waypoint0 (thing available_rover0))
+         (addeffect communicate_rock_data_rover0_general_waypoint1_waypoint3_waypoint0 (thing channel_free_general))
+         (addeffect communicate_rock_data_rover0_general_waypoint1_waypoint3_waypoint0 (thing communicated_rock_data_waypoint1))
+         (addeffect communicate_rock_data_rover0_general_waypoint2_waypoint1_waypoint0 (thing available_rover0))
+         (addeffect communicate_rock_data_rover0_general_waypoint2_waypoint1_waypoint0 (thing channel_free_general))
+         (addeffect communicate_rock_data_rover0_general_waypoint2_waypoint1_waypoint0 (thing communicated_rock_data_waypoint2))
+         (addeffect communicate_rock_data_rover0_general_waypoint2_waypoint2_waypoint0 (thing available_rover0))
+         (addeffect communicate_rock_data_rover0_general_waypoint2_waypoint2_waypoint0 (thing channel_free_general))
+         (addeffect communicate_rock_data_rover0_general_waypoint2_waypoint2_waypoint0 (thing communicated_rock_data_waypoint2))
+         (addeffect communicate_rock_data_rover0_general_waypoint2_waypoint3_waypoint0 (thing available_rover0))
+         (addeffect communicate_rock_data_rover0_general_waypoint2_waypoint3_waypoint0 (thing channel_free_general))
+         (addeffect communicate_rock_data_rover0_general_waypoint2_waypoint3_waypoint0 (thing communicated_rock_data_waypoint2))
+         (addeffect communicate_rock_data_rover0_general_waypoint3_waypoint1_waypoint0 (thing available_rover0))
+         (addeffect communicate_rock_data_rover0_general_waypoint3_waypoint1_waypoint0 (thing channel_free_general))
+         (addeffect communicate_rock_data_rover0_general_waypoint3_waypoint1_waypoint0 (thing communicated_rock_data_waypoint3))
+         (addeffect communicate_rock_data_rover0_general_waypoint3_waypoint2_waypoint0 (thing available_rover0))
+         (addeffect communicate_rock_data_rover0_general_waypoint3_waypoint2_waypoint0 (thing channel_free_general))
+         (addeffect communicate_rock_data_rover0_general_waypoint3_waypoint2_waypoint0 (thing communicated_rock_data_waypoint3))
+         (addeffect communicate_rock_data_rover0_general_waypoint3_waypoint3_waypoint0 (thing available_rover0))
+         (addeffect communicate_rock_data_rover0_general_waypoint3_waypoint3_waypoint0 (thing channel_free_general))
+         (addeffect communicate_rock_data_rover0_general_waypoint3_waypoint3_waypoint0 (thing communicated_rock_data_waypoint3))
+         (addeffect communicate_soil_data_rover0_general_waypoint0_waypoint1_waypoint0 (thing available_rover0))
+         (addeffect communicate_soil_data_rover0_general_waypoint0_waypoint1_waypoint0 (thing channel_free_general))
+         (addeffect communicate_soil_data_rover0_general_waypoint0_waypoint1_waypoint0 (thing communicated_soil_data_waypoint0))
+         (addeffect communicate_soil_data_rover0_general_waypoint0_waypoint2_waypoint0 (thing available_rover0))
+         (addeffect communicate_soil_data_rover0_general_waypoint0_waypoint2_waypoint0 (thing channel_free_general))
+         (addeffect communicate_soil_data_rover0_general_waypoint0_waypoint2_waypoint0 (thing communicated_soil_data_waypoint0))
+         (addeffect communicate_soil_data_rover0_general_waypoint0_waypoint3_waypoint0 (thing available_rover0))
+         (addeffect communicate_soil_data_rover0_general_waypoint0_waypoint3_waypoint0 (thing channel_free_general))
+         (addeffect communicate_soil_data_rover0_general_waypoint0_waypoint3_waypoint0 (thing communicated_soil_data_waypoint0))
+         (addeffect communicate_soil_data_rover0_general_waypoint2_waypoint1_waypoint0 (thing available_rover0))
+         (addeffect communicate_soil_data_rover0_general_waypoint2_waypoint1_waypoint0 (thing channel_free_general))
+         (addeffect communicate_soil_data_rover0_general_waypoint2_waypoint1_waypoint0 (thing communicated_soil_data_waypoint2))
+         (addeffect communicate_soil_data_rover0_general_waypoint2_waypoint2_waypoint0 (thing available_rover0))
+         (addeffect communicate_soil_data_rover0_general_waypoint2_waypoint2_waypoint0 (thing channel_free_general))
+         (addeffect communicate_soil_data_rover0_general_waypoint2_waypoint2_waypoint0 (thing communicated_soil_data_waypoint2))
+         (addeffect communicate_soil_data_rover0_general_waypoint2_waypoint3_waypoint0 (thing available_rover0))
+         (addeffect communicate_soil_data_rover0_general_waypoint2_waypoint3_waypoint0 (thing channel_free_general))
+         (addeffect communicate_soil_data_rover0_general_waypoint2_waypoint3_waypoint0 (thing communicated_soil_data_waypoint2))
+         (addeffect communicate_soil_data_rover0_general_waypoint3_waypoint1_waypoint0 (thing available_rover0))
+         (addeffect communicate_soil_data_rover0_general_waypoint3_waypoint1_waypoint0 (thing channel_free_general))
+         (addeffect communicate_soil_data_rover0_general_waypoint3_waypoint1_waypoint0 (thing communicated_soil_data_waypoint3))
+         (addeffect communicate_soil_data_rover0_general_waypoint3_waypoint2_waypoint0 (thing available_rover0))
+         (addeffect communicate_soil_data_rover0_general_waypoint3_waypoint2_waypoint0 (thing channel_free_general))
+         (addeffect communicate_soil_data_rover0_general_waypoint3_waypoint2_waypoint0 (thing communicated_soil_data_waypoint3))
+         (addeffect communicate_soil_data_rover0_general_waypoint3_waypoint3_waypoint0 (thing available_rover0))
+         (addeffect communicate_soil_data_rover0_general_waypoint3_waypoint3_waypoint0 (thing channel_free_general))
+         (addeffect communicate_soil_data_rover0_general_waypoint3_waypoint3_waypoint0 (thing communicated_soil_data_waypoint3))
+         (addeffect drop_rover0_rover0store (thing empty_rover0store))
+         (addeffect navigate_rover0_waypoint0_waypoint3 (thing at_rover0_waypoint3))
+         (addeffect navigate_rover0_waypoint1_waypoint2 (thing at_rover0_waypoint2))
+         (addeffect navigate_rover0_waypoint1_waypoint3 (thing at_rover0_waypoint3))
+         (addeffect navigate_rover0_waypoint2_waypoint1 (thing at_rover0_waypoint1))
+         (addeffect navigate_rover0_waypoint3_waypoint0 (thing at_rover0_waypoint0))
+         (addeffect navigate_rover0_waypoint3_waypoint1 (thing at_rover0_waypoint1))
+         (addeffect sample_rock_rover0_rover0store_waypoint1 (thing full_rover0store))
+         (addeffect sample_rock_rover0_rover0store_waypoint1 (thing have_rock_analysis_rover0_waypoint1))
+         (addeffect sample_rock_rover0_rover0store_waypoint2 (thing full_rover0store))
+         (addeffect sample_rock_rover0_rover0store_waypoint2 (thing have_rock_analysis_rover0_waypoint2))
+         (addeffect sample_rock_rover0_rover0store_waypoint3 (thing full_rover0store))
+         (addeffect sample_rock_rover0_rover0store_waypoint3 (thing have_rock_analysis_rover0_waypoint3))
+         (addeffect sample_soil_rover0_rover0store_waypoint0 (thing full_rover0store))
+         (addeffect sample_soil_rover0_rover0store_waypoint0 (thing have_soil_analysis_rover0_waypoint0))
+         (addeffect sample_soil_rover0_rover0store_waypoint2 (thing full_rover0store))
+         (addeffect sample_soil_rover0_rover0store_waypoint2 (thing have_soil_analysis_rover0_waypoint2))
+         (addeffect sample_soil_rover0_rover0store_waypoint3 (thing full_rover0store))
+         (addeffect sample_soil_rover0_rover0store_waypoint3 (thing have_soil_analysis_rover0_waypoint3))
+         (addeffect take_image_rover0_waypoint0_objective0_camera0_colour (thing have_image_rover0_objective0_colour))
+         (addeffect take_image_rover0_waypoint0_objective0_camera0_high_res (thing have_image_rover0_objective0_high_res))
+         (addeffect take_image_rover0_waypoint0_objective1_camera0_colour (thing have_image_rover0_objective1_colour))
+         (addeffect take_image_rover0_waypoint0_objective1_camera0_high_res (thing have_image_rover0_objective1_high_res))
+         (addeffect take_image_rover0_waypoint1_objective0_camera0_colour (thing have_image_rover0_objective0_colour))
+         (addeffect take_image_rover0_waypoint1_objective0_camera0_high_res (thing have_image_rover0_objective0_high_res))
+         (addeffect take_image_rover0_waypoint1_objective1_camera0_colour (thing have_image_rover0_objective1_colour))
+         (addeffect take_image_rover0_waypoint1_objective1_camera0_high_res (thing have_image_rover0_objective1_high_res))
+         (addeffect take_image_rover0_waypoint2_objective0_camera0_colour (thing have_image_rover0_objective0_colour))
+         (addeffect take_image_rover0_waypoint2_objective0_camera0_high_res (thing have_image_rover0_objective0_high_res))
+         (addeffect take_image_rover0_waypoint2_objective1_camera0_colour (thing have_image_rover0_objective1_colour))
+         (addeffect take_image_rover0_waypoint2_objective1_camera0_high_res (thing have_image_rover0_objective1_high_res))
+         (addeffect take_image_rover0_waypoint3_objective0_camera0_colour (thing have_image_rover0_objective0_colour))
+         (addeffect take_image_rover0_waypoint3_objective0_camera0_high_res (thing have_image_rover0_objective0_high_res))
+         (addeffect take_image_rover0_waypoint3_objective1_camera0_colour (thing have_image_rover0_objective1_colour))
+         (addeffect take_image_rover0_waypoint3_objective1_camera0_high_res (thing have_image_rover0_objective1_high_res)))
+
+  (facts (deleteeffect drop_rover0_rover0store (thing full_rover0store))
+         (deleteeffect navigate_rover0_waypoint0_waypoint3 (thing at_rover0_waypoint0))
+         (deleteeffect navigate_rover0_waypoint1_waypoint2 (thing at_rover0_waypoint1))
+         (deleteeffect navigate_rover0_waypoint1_waypoint3 (thing at_rover0_waypoint1))
+         (deleteeffect navigate_rover0_waypoint2_waypoint1 (thing at_rover0_waypoint2))
+         (deleteeffect navigate_rover0_waypoint3_waypoint0 (thing at_rover0_waypoint3))
+         (deleteeffect navigate_rover0_waypoint3_waypoint1 (thing at_rover0_waypoint3))
+         (deleteeffect sample_rock_rover0_rover0store_waypoint1 (thing at_rock_sample_waypoint1))
+         (deleteeffect sample_rock_rover0_rover0store_waypoint1 (thing empty_rover0store))
+         (deleteeffect sample_rock_rover0_rover0store_waypoint2 (thing at_rock_sample_waypoint2))
+         (deleteeffect sample_rock_rover0_rover0store_waypoint2 (thing empty_rover0store))
+         (deleteeffect sample_rock_rover0_rover0store_waypoint3 (thing at_rock_sample_waypoint3))
+         (deleteeffect sample_rock_rover0_rover0store_waypoint3 (thing empty_rover0store))
+         (deleteeffect sample_soil_rover0_rover0store_waypoint0 (thing at_soil_sample_waypoint0))
+         (deleteeffect sample_soil_rover0_rover0store_waypoint0 (thing empty_rover0store))
+         (deleteeffect sample_soil_rover0_rover0store_waypoint2 (thing at_soil_sample_waypoint2))
+         (deleteeffect sample_soil_rover0_rover0store_waypoint2 (thing empty_rover0store))
+         (deleteeffect sample_soil_rover0_rover0store_waypoint3 (thing at_soil_sample_waypoint3))
+         (deleteeffect sample_soil_rover0_rover0store_waypoint3 (thing empty_rover0store))
+         (deleteeffect take_image_rover0_waypoint0_objective0_camera0_colour (thing calibrated_camera0_rover0))
+         (deleteeffect take_image_rover0_waypoint0_objective0_camera0_high_res (thing calibrated_camera0_rover0))
+         (deleteeffect take_image_rover0_waypoint0_objective1_camera0_colour (thing calibrated_camera0_rover0))
+         (deleteeffect take_image_rover0_waypoint0_objective1_camera0_high_res (thing calibrated_camera0_rover0))
+         (deleteeffect take_image_rover0_waypoint1_objective0_camera0_colour (thing calibrated_camera0_rover0))
+         (deleteeffect take_image_rover0_waypoint1_objective0_camera0_high_res (thing calibrated_camera0_rover0))
+         (deleteeffect take_image_rover0_waypoint1_objective1_camera0_colour (thing calibrated_camera0_rover0))
+         (deleteeffect take_image_rover0_waypoint1_objective1_camera0_high_res (thing calibrated_camera0_rover0))
+         (deleteeffect take_image_rover0_waypoint2_objective0_camera0_colour (thing calibrated_camera0_rover0))
+         (deleteeffect take_image_rover0_waypoint2_objective0_camera0_high_res (thing calibrated_camera0_rover0))
+         (deleteeffect take_image_rover0_waypoint2_objective1_camera0_colour (thing calibrated_camera0_rover0))
+         (deleteeffect take_image_rover0_waypoint2_objective1_camera0_high_res (thing calibrated_camera0_rover0))
+         (deleteeffect take_image_rover0_waypoint3_objective0_camera0_colour (thing calibrated_camera0_rover0))
+         (deleteeffect take_image_rover0_waypoint3_objective0_camera0_high_res (thing calibrated_camera0_rover0))
+         (deleteeffect take_image_rover0_waypoint3_objective1_camera0_colour (thing calibrated_camera0_rover0))
+         (deleteeffect take_image_rover0_waypoint3_objective1_camera0_high_res (thing calibrated_camera0_rover0)))
+
+  (rules
+    ((next :state :performed (thing :pred))
+     (does :performed solver :action)
+     (true :state (thing :pred))
+     (not (deleteeffect :action (thing :pred))))
+
+    ((next :state :performed (thing :pred))
+     (does :performed solver :action)
+     (addeffect :action (thing :pred)))
+
+    ((next :state :performed (step :y))
+     (true :state (step :x))
+     (succ :x :y)))
+
+  (facts (succ num1 num2)
+         (succ num2 num3)
+         (succ num3 num4)
+         (succ num4 num5)
+         (succ num5 num6)
+         (succ num6 num7)
+         (succ num7 num8)
+         (succ num8 num9)
+         (succ num9 num10)
+         (succ num10 num11)
+         (succ num11 num12)
+         (succ num12 num13)
+         (succ num13 num14)
+         (succ num14 num15)
+         (succ num15 num16)
+         (succ num16 num17)
+         (succ num17 num18)
+         (succ num18 num19)
+         (succ num19 num20)
+         (succ num20 num21)
+         (succ num21 num22)
+         (succ num22 num23)
+         (succ num23 num24)
+         (succ num24 num25)
+         (succ num25 num26)
+         (succ num26 num27)
+         (succ num27 num28)
+         (succ num28 num29)
+         (succ num29 num30)
+         (succ num30 num31))
+  )
+
+
+(defun extract (key results)
+  (mapcar (lambda (result) (getf result key)) results))
+
+(defun to-prolog-list (l)
+  (if (null l)
+    nil
+    (list* 'list l)))
+
+(defun initial-state ()
+  (to-prolog-list
+    (with-database *d*
+      (extract :what (return-all (init :what))))))
+
+(defun terminalp (state)
+  (with-database *d*
+    (perform-prove `((terminal ,state)))))
+
+(defun legal-moves (state)
+  (with-database *d*
+    (perform-return `((legal ,state :role :move)) :all)))
+
+(defun roles ()
+  (with-database *d*
+    (extract :role (return-all (role :role)))))
+
+(defun goal-value (state role)
+  (with-database *d*
+    (getf (perform-return `((goal ,state ,role :goal)) :one) :goal)))
+
+(defun goal-values (state)
+  (with-database *d*
+    (perform-return `((goal ,state :role :goal)) :all)))
+
+(defun next-state (current-state move)
+  (let ((does `(list (does
+                       ,(getf move :role)
+                       ,(getf move :move)))))
+    (with-database *d*
+      (to-prolog-list
+        (extract :what
+                 (perform-return `((next ,current-state ,does :what)) :all))))))
+
+
+
+(defvar *count* 0)
+
+(defstruct search-path state (path nil) (previous nil))
+
+(defun tree-search (states goal-p children combine)
+  (labels
+      ((recur (states)
+         (if (null states)
+           nil
+           (destructuring-bind (state . remaining) states
+             (incf *count*)
+             (when (zerop (rem *count* 1000))
+               (format t "~D...~%" *count*))
+             ; (format t "Searching: ~S (~D remaining)~%"
+             ;         state
+             ;         (length remaining))
+             (if (funcall goal-p state)
+               state
+               (recur (funcall combine
+                               (funcall children state)
+                               remaining)))))))
+    (let ((result (recur states)))
+      (when result
+        (reverse (search-path-path result))))))
+
+
+(defun game-goal-p (search-path)
+  (let ((state (search-path-state search-path)))
+    (and (terminalp state)
+         (eql (goal-value state 'player) 'num100))))
+
+(defun game-children (search-path)
+  (let ((state (search-path-state search-path))
+        (path (search-path-path search-path)))
+    (when (not (terminalp state))
+      (loop :for move :in (legal-moves state)
+            :collect (make-search-path :state (next-state state move)
+                                       :path (cons move path)
+                                       :previous search-path)))))
+
+(defun never (&rest args)
+  (declare (ignore args))
+  nil)
+
+(defun dfs ()
+  (let ((*count* 0))
+    (tree-search (list (make-search-path :state (initial-state)))
+               #'game-goal-p
+               #'game-children
+               #'append)))
+
+(defun dfs-exhaust ()
+  (let ((*count* 0))
+    (prog1
+        (tree-search (list (make-search-path :state (initial-state)))
+                     #'never
+                     #'game-children
+                     #'append)
+      (format t "Searched ~D nodes.~%" *count*))))
+
+(defun bfs ()
+  (tree-search (list (make-search-path :state (initial-state)))
+               #'game-goal-p
+               #'game-children
+               (lambda (x y)
+                 (append y x))))