The Prolog binding

The generated SWI-Prolog predicates call a compiled foreign module over the robot core. Facts return through the final argument, records are dicts, and controls take a list of field=value pairs. Absent results are the atom null, distinct from the valid enum name none. Numeric arguments accept arithmetic expressions. A robot is a fold: optional on_start/2 sets memory and on_turn/3 returns its next value.

Install with make install SDK=/opt/clunkyard/sdk. Run with swipl -q -p library=/opt/clunkyard/sdk/bindings/prolog -s bot.pl -g main -t halt. The foreign module loads libclunkyard.so.2; no compiler runs in the robot.

A tiny robot

:- use_module(library(clunkyard)).
main :- run(user).
on_turn(R,State,State) :-
  sensors_nearest(R,Target),
  (Target==null->
    drive_set(R,[throttle=0.75,turn=0.25]),
    me_heading(R,Heading),scanner_set(R,[heading=Heading,arc=40]),
    scanner_last(R,Scan),status_set(R,[text="SEARCH",value=Scan.arc]);
    gun_power_for_flight_time(R,Target.range,1,Power),gun_lead(R,Target,Power,Aim),
    (Aim==null->gun_aim(R,[heading=Target.bearing,pitch=Target.elevation]);gun_aim(R,[heading=Aim.heading,pitch=Aim.pitch])),
    (gun_can_fire(R,Power,10,true)->gun_fire(R,[power=Power]);true),
    me_heading(R,Heading),angles_angle_diff(Target.bearing,Heading,Off),angles_clamp(Off,-1,1,Turn),
    drive_set(R,[throttle=0.5,turn=Turn]),scanner_set(R,[heading=Target.bearing,arc=10]),status_set(R,[text="TRACK",value=Target.range])).

make test SDK=... checks the actual generated API against every core vector, including exact floating-point results and act lines. Core errors raise a language error carrying their status. A core fault during input sends its empty act and continues with the next state. User exceptions are logged and send the controls already set. Use the binding’s forfeit helper to give up a match; play runs protocol lines in memory for tests.

Names

Every entry of the robot API 2.0.0 in Prolog / CHR. names.md has every language side by side.

Canonical Form Prolog / CHR
match.mode property match_mode
match.ruleset property match_ruleset
match.control property match_control
match.robots property match_robots
match.is_3d property match_is_3d
match.tick_rate property match_tick_rate
match.max_ticks property match_max_ticks
match.robot_id call match_robot_id
clock.tick property clock_tick
clock.seconds property clock_seconds
clock.remaining_ticks property clock_remaining_ticks
arena.size property arena_size
arena.gravity property arena_gravity
arena.terrain_kind property arena_terrain_kind
arena.ground_height call arena_ground_height
me.health property me_health
me.position property me_position
me.velocity property me_velocity
me.heading property me_heading
me.pitch property me_pitch
me.roll property me_roll
me.angular_velocity property me_angular_velocity
me.attitude property me_attitude
me.grounded property me_grounded
me.altitude property me_altitude
me.applied property me_applied
battery.charge property battery_charge
battery.capacity property battery_capacity
battery.regen property battery_regen
battery.sustainable_drive property battery_sustainable_drive
battery.compute property battery_compute
battery.drive_cost call battery_drive_cost
drive.hover_lift property drive_hover_lift
drive.set control drive_set
drive.forces control drive_forces
drive.get call drive_get
gun.aim_now property gun_aim_now
gun.cooldown_ticks property gun_cooldown_ticks
gun.spread property gun_spread
gun.max_power property gun_max_power
gun.damage_scale property gun_damage_scale
gun.can_fire call gun_can_fire
gun.shot_speed call gun_shot_speed
gun.shot_cost call gun_shot_cost
gun.reload_ticks call gun_reload_ticks
gun.shot_damage call gun_shot_damage
gun.power_for_speed call gun_power_for_speed
gun.power_for_flight_time call gun_power_for_flight_time
gun.lead call gun_lead
gun.lead_point call gun_lead_point
gun.aim control gun_aim
gun.fire control gun_fire
gun.get call gun_get
scanner.last property scanner_last
scanner.proximity_range property scanner_proximity_range
scanner.reach call scanner_reach
scanner.arc_for_reach call scanner_arc_for_reach
scanner.set control scanner_set
scanner.get call scanner_get
sensors.contacts property sensors_contacts
sensors.nearest property sensors_nearest
sensors.cues property sensors_cues
sensors.contact call sensors_contact
sensors.position_of call sensors_position_of
tracker.cue property tracker_cue
tracker.nearest_bearing_rate property tracker_nearest_bearing_rate
tracker.velocity call tracker_velocity
tracker.position call tracker_position
tracker.last_seen call tracker_last_seen
tracker.configure call tracker_configure
nav.zone property nav_zone
nav.zone.margin call nav_zone_margin
nav.zone.contains call nav_zone_contains
nav.zone.distance_from call nav_zone_distance_from
nav.storm property nav_storm
nav.storm.margin call nav_storm_margin
nav.storm.contains call nav_storm_contains
nav.storm.distance_from call nav_storm_distance_from
nav.hill property nav_hill
nav.hill.margin call nav_hill_margin
nav.hill.contains call nav_hill_contains
nav.hill.distance_from call nav_hill_distance_from
nav.pickups property nav_pickups
nav.nearest_pickup call nav_nearest_pickup
nav.field_distance call nav_field_distance
score.me property score_me
score.best property score_best
score.armour property score_armour
angles.normalize call angles_normalize
angles.angle_diff call angles_angle_diff
angles.bearing_to call angles_bearing_to
angles.elevation_to call angles_elevation_to
angles.direction call angles_direction
angles.distance call angles_distance
angles.clamp call angles_clamp
status.set control status_set
status.get call status_get
raw.number call raw_number
raw.text call raw_text
raw.has call raw_has
raw.flag call raw_flag
raw.count call raw_count
raw.line call raw_line
raw.extra call raw_extra
session.event property session_event
session.next call session_next
session.send call session_send
session.forfeit call session_forfeit
session.log call session_log
session.feed call session_feed
session.reply call session_reply

Download this page as Markdown