# HG changeset patch # User Steve Losh # Date 1467309229 0 # Node ID 802872f9505ad030ab548922fdf4361367ab4cf5 # Parent 4520c6449f483053d78c27c162bc72dc38dda5b7 Add AIPS Rovers example diff -r 4520c6449f48 -r 802872f9505a examples/ggp-wam-rover.lisp --- /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))))