From 6b7930104bdb845d3b9c085dc04f52b6446f23b1 Mon Sep 17 00:00:00 2001 From: lbsa71 Date: Tue, 24 Jun 2008 21:09:49 +0000 Subject: * Applied patch from Melanie, mantis issue #1581 - "Refactor LSL language, api and compiler out of XEngine" "First stage in a major Script Engine refactor, that will result in the LSL implementaions ebing reconverged. Not there yet, but one major part is done." Thank you, Melanie! --- .../Shared/Api/Runtime/LSL_Constants.cs | 421 ++ .../ScriptEngine/Shared/Api/Runtime/LSL_Stub.cs | 1732 ++++++ .../ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs | 199 + ...m.Region.ScriptEngine.Shared.Api.Runtime.csproj | 161 + ...ion.ScriptEngine.Shared.Api.Runtime.csproj.user | 12 + ...egion.ScriptEngine.Shared.Api.Runtime.dll.build | 62 + ...nSim.Region.ScriptEngine.Shared.Api.Runtime.mdp | 43 + .../ScriptEngine/Shared/Api/Runtime/ScriptBase.cs | 124 + .../Shared/Api/Runtime/YieldProlog/Atom.cs | 218 + .../Shared/Api/Runtime/YieldProlog/BagofAnswers.cs | 234 + .../Api/Runtime/YieldProlog/FindallAnswers.cs | 103 + .../Shared/Api/Runtime/YieldProlog/Functor.cs | 188 + .../Shared/Api/Runtime/YieldProlog/Functor1.cs | 111 + .../Shared/Api/Runtime/YieldProlog/Functor2.cs | 154 + .../Shared/Api/Runtime/YieldProlog/Functor3.cs | 133 + .../Api/Runtime/YieldProlog/IndexedAnswers.cs | 288 + .../Shared/Api/Runtime/YieldProlog/ListPair.cs | 156 + .../Shared/Api/Runtime/YieldProlog/Parser.cs | 4457 +++++++++++++++ .../Api/Runtime/YieldProlog/PrologException.cs | 71 + .../YieldProlog/UndefinedPredicateException.cs | 62 + .../Shared/Api/Runtime/YieldProlog/Variable.cs | 196 + .../Shared/Api/Runtime/YieldProlog/YP.cs | 1644 ++++++ .../Shared/Api/Runtime/YieldProlog/YPCompiler.cs | 5651 ++++++++++++++++++++ 23 files changed, 16420 insertions(+) create mode 100644 OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs create mode 100644 OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Stub.cs create mode 100644 OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs create mode 100644 OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OpenSim.Region.ScriptEngine.Shared.Api.Runtime.csproj create mode 100644 OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OpenSim.Region.ScriptEngine.Shared.Api.Runtime.csproj.user create mode 100644 OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OpenSim.Region.ScriptEngine.Shared.Api.Runtime.dll.build create mode 100644 OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OpenSim.Region.ScriptEngine.Shared.Api.Runtime.mdp create mode 100644 OpenSim/Region/ScriptEngine/Shared/Api/Runtime/ScriptBase.cs create mode 100644 OpenSim/Region/ScriptEngine/Shared/Api/Runtime/YieldProlog/Atom.cs create mode 100644 OpenSim/Region/ScriptEngine/Shared/Api/Runtime/YieldProlog/BagofAnswers.cs create mode 100644 OpenSim/Region/ScriptEngine/Shared/Api/Runtime/YieldProlog/FindallAnswers.cs create mode 100644 OpenSim/Region/ScriptEngine/Shared/Api/Runtime/YieldProlog/Functor.cs create mode 100644 OpenSim/Region/ScriptEngine/Shared/Api/Runtime/YieldProlog/Functor1.cs create mode 100644 OpenSim/Region/ScriptEngine/Shared/Api/Runtime/YieldProlog/Functor2.cs create mode 100644 OpenSim/Region/ScriptEngine/Shared/Api/Runtime/YieldProlog/Functor3.cs create mode 100644 OpenSim/Region/ScriptEngine/Shared/Api/Runtime/YieldProlog/IndexedAnswers.cs create mode 100644 OpenSim/Region/ScriptEngine/Shared/Api/Runtime/YieldProlog/ListPair.cs create mode 100644 OpenSim/Region/ScriptEngine/Shared/Api/Runtime/YieldProlog/Parser.cs create mode 100644 OpenSim/Region/ScriptEngine/Shared/Api/Runtime/YieldProlog/PrologException.cs create mode 100644 OpenSim/Region/ScriptEngine/Shared/Api/Runtime/YieldProlog/UndefinedPredicateException.cs create mode 100644 OpenSim/Region/ScriptEngine/Shared/Api/Runtime/YieldProlog/Variable.cs create mode 100644 OpenSim/Region/ScriptEngine/Shared/Api/Runtime/YieldProlog/YP.cs create mode 100644 OpenSim/Region/ScriptEngine/Shared/Api/Runtime/YieldProlog/YPCompiler.cs (limited to 'OpenSim/Region/ScriptEngine/Shared/Api/Runtime') diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs new file mode 100644 index 0000000..69be69b --- /dev/null +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs @@ -0,0 +1,421 @@ +/* + * Copyright (c) Contributors, http://opensimulator.org/ + * See CONTRIBUTORS.TXT for a full list of copyright holders. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the OpenSim Project nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +using System; +using vector = OpenSim.Region.ScriptEngine.Shared.LSL_Types.Vector3; +using rotation = OpenSim.Region.ScriptEngine.Shared.LSL_Types.Quaternion; + +namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase +{ + public partial class ScriptBaseClass : MarshalByRefObject + { + // LSL CONSTANTS + public const int TRUE = 1; + public const int FALSE = 0; + + public const int STATUS_PHYSICS = 1; + public const int STATUS_ROTATE_X = 2; + public const int STATUS_ROTATE_Y = 4; + public const int STATUS_ROTATE_Z = 8; + public const int STATUS_PHANTOM = 16; + public const int STATUS_SANDBOX = 32; + public const int STATUS_BLOCK_GRAB = 64; + public const int STATUS_DIE_AT_EDGE = 128; + public const int STATUS_RETURN_AT_EDGE = 256; + public const int STATUS_CAST_SHADOWS = 512; + + public const int AGENT = 1; + public const int ACTIVE = 2; + public const int PASSIVE = 4; + public const int SCRIPTED = 8; + + public const int CONTROL_FWD = 1; + public const int CONTROL_BACK = 2; + public const int CONTROL_LEFT = 4; + public const int CONTROL_RIGHT = 8; + public const int CONTROL_UP = 16; + public const int CONTROL_DOWN = 32; + public const int CONTROL_ROT_LEFT = 256; + public const int CONTROL_ROT_RIGHT = 512; + public const int CONTROL_LBUTTON = 268435456; + public const int CONTROL_ML_LBUTTON = 1073741824; + + //Permissions + public const int PERMISSION_DEBIT = 2; + public const int PERMISSION_TAKE_CONTROLS = 4; + public const int PERMISSION_REMAP_CONTROLS = 8; + public const int PERMISSION_TRIGGER_ANIMATION = 16; + public const int PERMISSION_ATTACH = 32; + public const int PERMISSION_RELEASE_OWNERSHIP = 64; + public const int PERMISSION_CHANGE_LINKS = 128; + public const int PERMISSION_CHANGE_JOINTS = 256; + public const int PERMISSION_CHANGE_PERMISSIONS = 512; + public const int PERMISSION_TRACK_CAMERA = 1024; + + public const int AGENT_FLYING = 1; + public const int AGENT_ATTACHMENTS = 2; + public const int AGENT_SCRIPTED = 4; + public const int AGENT_MOUSELOOK = 8; + public const int AGENT_SITTING = 16; + public const int AGENT_ON_OBJECT = 32; + public const int AGENT_AWAY = 64; + public const int AGENT_WALKING = 128; + public const int AGENT_IN_AIR = 256; + public const int AGENT_TYPING = 512; + public const int AGENT_CROUCHING = 1024; + public const int AGENT_BUSY = 2048; + public const int AGENT_ALWAYS_RUN = 4096; + + //Particle Systems + public const int PSYS_PART_INTERP_COLOR_MASK = 1; + public const int PSYS_PART_INTERP_SCALE_MASK = 2; + public const int PSYS_PART_BOUNCE_MASK = 4; + public const int PSYS_PART_WIND_MASK = 8; + public const int PSYS_PART_FOLLOW_SRC_MASK = 16; + public const int PSYS_PART_FOLLOW_VELOCITY_MASK = 32; + public const int PSYS_PART_TARGET_POS_MASK = 64; + public const int PSYS_PART_TARGET_LINEAR_MASK = 128; + public const int PSYS_PART_EMISSIVE_MASK = 256; + public const int PSYS_PART_FLAGS = 0; + public const int PSYS_PART_START_COLOR = 1; + public const int PSYS_PART_START_ALPHA = 2; + public const int PSYS_PART_END_COLOR = 3; + public const int PSYS_PART_END_ALPHA = 4; + public const int PSYS_PART_START_SCALE = 5; + public const int PSYS_PART_END_SCALE = 6; + public const int PSYS_PART_MAX_AGE = 7; + public const int PSYS_SRC_ACCEL = 8; + public const int PSYS_SRC_PATTERN = 9; + public const int PSYS_SRC_INNERANGLE = 10; + public const int PSYS_SRC_OUTERANGLE = 11; + public const int PSYS_SRC_TEXTURE = 12; + public const int PSYS_SRC_BURST_RATE = 13; + public const int PSYS_SRC_BURST_PART_COUNT = 15; + public const int PSYS_SRC_BURST_RADIUS = 16; + public const int PSYS_SRC_BURST_SPEED_MIN = 17; + public const int PSYS_SRC_BURST_SPEED_MAX = 18; + public const int PSYS_SRC_MAX_AGE = 19; + public const int PSYS_SRC_TARGET_KEY = 20; + public const int PSYS_SRC_OMEGA = 21; + public const int PSYS_SRC_ANGLE_BEGIN = 22; + public const int PSYS_SRC_ANGLE_END = 23; + public const int PSYS_SRC_PATTERN_DROP = 1; + public const int PSYS_SRC_PATTERN_EXPLODE = 2; + public const int PSYS_SRC_PATTERN_ANGLE = 4; + public const int PSYS_SRC_PATTERN_ANGLE_CONE = 8; + public const int PSYS_SRC_PATTERN_ANGLE_CONE_EMPTY = 16; + + public const int VEHICLE_TYPE_NONE = 0; + public const int VEHICLE_TYPE_SLED = 1; + public const int VEHICLE_TYPE_CAR = 2; + public const int VEHICLE_TYPE_BOAT = 3; + public const int VEHICLE_TYPE_AIRPLANE = 4; + public const int VEHICLE_TYPE_BALLOON = 5; + public const int VEHICLE_LINEAR_FRICTION_TIMESCALE = 16; + public const int VEHICLE_ANGULAR_FRICTION_TIMESCALE = 17; + public const int VEHICLE_LINEAR_MOTOR_DIRECTION = 18; + public const int VEHICLE_LINEAR_MOTOR_OFFSET = 20; + public const int VEHICLE_ANGULAR_MOTOR_DIRECTION = 19; + public const int VEHICLE_HOVER_HEIGHT = 24; + public const int VEHICLE_HOVER_EFFICIENCY = 25; + public const int VEHICLE_HOVER_TIMESCALE = 26; + public const int VEHICLE_BUOYANCY = 27; + public const int VEHICLE_LINEAR_DEFLECTION_EFFICIENCY = 28; + public const int VEHICLE_LINEAR_DEFLECTION_TIMESCALE = 29; + public const int VEHICLE_LINEAR_MOTOR_TIMESCALE = 30; + public const int VEHICLE_LINEAR_MOTOR_DECAY_TIMESCALE = 31; + public const int VEHICLE_ANGULAR_DEFLECTION_EFFICIENCY = 32; + public const int VEHICLE_ANGULAR_DEFLECTION_TIMESCALE = 33; + public const int VEHICLE_ANGULAR_MOTOR_TIMESCALE = 34; + public const int VEHICLE_ANGULAR_MOTOR_DECAY_TIMESCALE = 35; + public const int VEHICLE_VERTICAL_ATTRACTION_EFFICIENCY = 36; + public const int VEHICLE_VERTICAL_ATTRACTION_TIMESCALE = 37; + public const int VEHICLE_BANKING_EFFICIENCY = 38; + public const int VEHICLE_BANKING_MIX = 39; + public const int VEHICLE_BANKING_TIMESCALE = 40; + public const int VEHICLE_REFERENCE_FRAME = 44; + public const int VEHICLE_FLAG_NO_DEFLECTION_UP = 1; + public const int VEHICLE_FLAG_LIMIT_ROLL_ONLY = 2; + public const int VEHICLE_FLAG_HOVER_WATER_ONLY = 4; + public const int VEHICLE_FLAG_HOVER_TERRAIN_ONLY = 8; + public const int VEHICLE_FLAG_HOVER_GLOBAL_HEIGHT = 16; + public const int VEHICLE_FLAG_HOVER_UP_ONLY = 32; + public const int VEHICLE_FLAG_LIMIT_MOTOR_UP = 64; + public const int VEHICLE_FLAG_MOUSELOOK_STEER = 128; + public const int VEHICLE_FLAG_MOUSELOOK_BANK = 256; + public const int VEHICLE_FLAG_CAMERA_DECOUPLED = 512; + + public const int INVENTORY_ALL = -1; + public const int INVENTORY_NONE = -1; + public const int INVENTORY_TEXTURE = 0; + public const int INVENTORY_SOUND = 1; + public const int INVENTORY_LANDMARK = 3; + public const int INVENTORY_CLOTHING = 5; + public const int INVENTORY_OBJECT = 6; + public const int INVENTORY_NOTECARD = 7; + public const int INVENTORY_SCRIPT = 10; + public const int INVENTORY_BODYPART = 13; + public const int INVENTORY_ANIMATION = 20; + public const int INVENTORY_GESTURE = 21; + + public const int ATTACH_CHEST = 1; + public const int ATTACH_HEAD = 2; + public const int ATTACH_LSHOULDER = 3; + public const int ATTACH_RSHOULDER = 4; + public const int ATTACH_LHAND = 5; + public const int ATTACH_RHAND = 6; + public const int ATTACH_LFOOT = 7; + public const int ATTACH_RFOOT = 8; + public const int ATTACH_BACK = 9; + public const int ATTACH_PELVIS = 10; + public const int ATTACH_MOUTH = 11; + public const int ATTACH_CHIN = 12; + public const int ATTACH_LEAR = 13; + public const int ATTACH_REAR = 14; + public const int ATTACH_LEYE = 15; + public const int ATTACH_REYE = 16; + public const int ATTACH_NOSE = 17; + public const int ATTACH_RUARM = 18; + public const int ATTACH_RLARM = 19; + public const int ATTACH_LUARM = 20; + public const int ATTACH_LLARM = 21; + public const int ATTACH_RHIP = 22; + public const int ATTACH_RULEG = 23; + public const int ATTACH_RLLEG = 24; + public const int ATTACH_LHIP = 25; + public const int ATTACH_LULEG = 26; + public const int ATTACH_LLLEG = 27; + public const int ATTACH_BELLY = 28; + public const int ATTACH_RPEC = 29; + public const int ATTACH_LPEC = 30; + + public const int LAND_LEVEL = 0; + public const int LAND_RAISE = 1; + public const int LAND_LOWER = 2; + public const int LAND_SMOOTH = 3; + public const int LAND_NOISE = 4; + public const int LAND_REVERT = 5; + public const int LAND_SMALL_BRUSH = 1; + public const int LAND_MEDIUM_BRUSH = 2; + public const int LAND_LARGE_BRUSH = 3; + + //Agent Dataserver + public const int DATA_ONLINE = 1; + public const int DATA_NAME = 2; + public const int DATA_BORN = 3; + public const int DATA_RATING = 4; + public const int DATA_SIM_POS = 5; + public const int DATA_SIM_STATUS = 6; + public const int DATA_SIM_RATING = 7; + public const int DATA_PAYINFO = 8; + + public const int ANIM_ON = 1; + public const int LOOP = 2; + public const int REVERSE = 4; + public const int PING_PONG = 8; + public const int SMOOTH = 16; + public const int ROTATE = 32; + public const int SCALE = 64; + public const int ALL_SIDES = -1; + public const int LINK_SET = -1; + public const int LINK_ROOT = 1; + public const int LINK_ALL_OTHERS = -2; + public const int LINK_ALL_CHILDREN = -3; + public const int LINK_THIS = -4; + public const int CHANGED_INVENTORY = 1; + public const int CHANGED_COLOR = 2; + public const int CHANGED_SHAPE = 4; + public const int CHANGED_SCALE = 8; + public const int CHANGED_TEXTURE = 16; + public const int CHANGED_LINK = 32; + public const int CHANGED_ALLOWED_DROP = 64; + public const int CHANGED_OWNER = 128; + public const int CHANGED_REGION_RESTART = 256; + public const int TYPE_INVALID = 0; + public const int TYPE_INTEGER = 1; + public const int TYPE_double = 2; + public const int TYPE_STRING = 3; + public const int TYPE_KEY = 4; + public const int TYPE_VECTOR = 5; + public const int TYPE_ROTATION = 6; + + //XML RPC Remote Data Channel + public const int REMOTE_DATA_CHANNEL = 1; + public const int REMOTE_DATA_REQUEST = 2; + public const int REMOTE_DATA_REPLY = 3; + + //llHTTPRequest + public const int HTTP_METHOD = 0; + public const int HTTP_MIMETYPE = 1; + public const int HTTP_BODY_MAXLENGTH = 2; + public const int HTTP_VERIFY_CERT = 3; + + public const int PRIM_MATERIAL = 2; + public const int PRIM_PHYSICS = 3; + public const int PRIM_TEMP_ON_REZ = 4; + public const int PRIM_PHANTOM = 5; + public const int PRIM_POSITION = 6; + public const int PRIM_SIZE = 7; + public const int PRIM_ROTATION = 8; + public const int PRIM_TYPE = 9; + public const int PRIM_TEXTURE = 17; + public const int PRIM_COLOR = 18; + public const int PRIM_BUMP_SHINY = 19; + public const int PRIM_FULLBRIGHT = 20; + public const int PRIM_FLEXIBLE = 21; + public const int PRIM_TEXGEN = 22; + public const int PRIM_CAST_SHADOWS = 24; // Not implemented, here for completeness sake + public const int PRIM_POINT_LIGHT = 23; // Huh? + public const int PRIM_TEXGEN_DEFAULT = 0; + public const int PRIM_TEXGEN_PLANAR = 1; + + public const int PRIM_TYPE_BOX = 0; + public const int PRIM_TYPE_CYLINDER = 1; + public const int PRIM_TYPE_PRISM = 2; + public const int PRIM_TYPE_SPHERE = 3; + public const int PRIM_TYPE_TORUS = 4; + public const int PRIM_TYPE_TUBE = 5; + public const int PRIM_TYPE_RING = 6; + public const int PRIM_TYPE_SCULPT = 7; + + public const int PRIM_HOLE_DEFAULT = 0; + public const int PRIM_HOLE_CIRCLE = 16; + public const int PRIM_HOLE_SQUARE = 32; + public const int PRIM_HOLE_TRIANGLE = 48; + + public const int PRIM_MATERIAL_STONE = 0; + public const int PRIM_MATERIAL_METAL = 1; + public const int PRIM_MATERIAL_GLASS = 2; + public const int PRIM_MATERIAL_WOOD = 3; + public const int PRIM_MATERIAL_FLESH = 4; + public const int PRIM_MATERIAL_PLASTIC = 5; + public const int PRIM_MATERIAL_RUBBER = 6; + public const int PRIM_MATERIAL_LIGHT = 7; + + public const int PRIM_SHINY_NONE = 0; + public const int PRIM_SHINY_LOW = 1; + public const int PRIM_SHINY_MEDIUM = 2; + public const int PRIM_SHINY_HIGH = 3; + public const int PRIM_BUMP_NONE = 0; + public const int PRIM_BUMP_BRIGHT = 1; + public const int PRIM_BUMP_DARK = 2; + public const int PRIM_BUMP_WOOD = 3; + public const int PRIM_BUMP_BARK = 4; + public const int PRIM_BUMP_BRICKS = 5; + public const int PRIM_BUMP_CHECKER = 6; + public const int PRIM_BUMP_CONCRETE = 7; + public const int PRIM_BUMP_TILE = 8; + public const int PRIM_BUMP_STONE = 9; + public const int PRIM_BUMP_DISKS = 10; + public const int PRIM_BUMP_GRAVEL = 11; + public const int PRIM_BUMP_BLOBS = 12; + public const int PRIM_BUMP_SIDING = 13; + public const int PRIM_BUMP_LARGETILE = 14; + public const int PRIM_BUMP_STUCCO = 15; + public const int PRIM_BUMP_SUCTION = 16; + public const int PRIM_BUMP_WEAVE = 17; + + public const int PRIM_SCULPT_TYPE_SPHERE = 1; + public const int PRIM_SCULPT_TYPE_TORUS = 2; + public const int PRIM_SCULPT_TYPE_PLANE = 3; + public const int PRIM_SCULPT_TYPE_CYLINDER = 4; + + public const int MASK_BASE = 0; + public const int MASK_OWNER = 1; + public const int MASK_GROUP = 2; + public const int MASK_EVERYONE = 3; + public const int MASK_NEXT = 4; + + public const int PERM_TRANSFER = 8192; + public const int PERM_MODIFY = 16384; + public const int PERM_COPY = 32768; + public const int PERM_MOVE = 524288; + public const int PERM_ALL = 2147483647; + + public const int PARCEL_MEDIA_COMMAND_STOP = 0; + public const int PARCEL_MEDIA_COMMAND_PAUSE = 1; + public const int PARCEL_MEDIA_COMMAND_PLAY = 2; + public const int PARCEL_MEDIA_COMMAND_LOOP = 3; + public const int PARCEL_MEDIA_COMMAND_TEXTURE = 4; + public const int PARCEL_MEDIA_COMMAND_URL = 5; + public const int PARCEL_MEDIA_COMMAND_TIME = 6; + public const int PARCEL_MEDIA_COMMAND_AGENT = 7; + public const int PARCEL_MEDIA_COMMAND_UNLOAD = 8; + public const int PARCEL_MEDIA_COMMAND_AUTO_ALIGN = 9; + + public const int PAY_HIDE = -1; + public const int PAY_DEFAULT = -2; + + public const string NULL_KEY = "00000000-0000-0000-0000-000000000000"; + public const string EOF = "\n\n\n"; + public const double PI = 3.14159274f; + public const double TWO_PI = 6.28318548f; + public const double PI_BY_TWO = 1.57079637f; + public const double DEG_TO_RAD = 0.01745329238f; + public const double RAD_TO_DEG = 57.29578f; + public const double SQRT2 = 1.414213538f; + public const int STRING_TRIM_HEAD = 1; + public const int STRING_TRIM_TAIL = 2; + public const int STRING_TRIM = 3; + public const int LIST_STAT_RANGE = 0; + public const int LIST_STAT_MIN = 1; + public const int LIST_STAT_MAX = 2; + public const int LIST_STAT_MEAN = 3; + public const int LIST_STAT_MEDIAN = 4; + public const int LIST_STAT_STD_DEV = 5; + public const int LIST_STAT_SUM = 6; + public const int LIST_STAT_SUM_SQUARES = 7; + public const int LIST_STAT_NUM_COUNT = 8; + public const int LIST_STAT_GEOMETRIC_MEAN = 9; + public const int LIST_STAT_HARMONIC_MEAN = 100; + + //ParcelPrim Categories + public const int PARCEL_COUNT_TOTAL = 0; + public const int PARCEL_COUNT_OWNER = 1; + public const int PARCEL_COUNT_GROUP = 2; + public const int PARCEL_COUNT_OTHER = 3; + public const int PARCEL_COUNT_SELECTED = 4; + public const int PARCEL_COUNT_TEMP = 5; + + public const int DEBUG_CHANNEL = 0x7FFFFFFF; + public const int PUBLIC_CHANNEL = 0x00000000; + + public const int OBJECT_NAME = 1; + public const int OBJECT_DESC = 2; + public const int OBJECT_POS = 3; + public const int OBJECT_ROT = 4; + public const int OBJECT_VELOCITY = 5; + public const int OBJECT_OWNER = 6; + public const int OBJECT_GROUP = 7; + public const int OBJECT_CREATOR = 8; + + // Can not be public const? + public vector ZERO_VECTOR = new vector(0.0, 0.0, 0.0); + public rotation ZERO_ROTATION = new rotation(0.0, 0, 0.0, 1.0); + + } +} diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Stub.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Stub.cs new file mode 100644 index 0000000..7b3907f --- /dev/null +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Stub.cs @@ -0,0 +1,1732 @@ +/* + * Copyright (c) Contributors, http://opensimulator.org/ + * See CONTRIBUTORS.TXT for a full list of copyright holders. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the OpenSim Project nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +using System; +using System.Runtime.Remoting.Lifetime; +using System.Threading; +using System.Reflection; +using System.Collections; +using System.Collections.Generic; +using OpenSim.Region.ScriptEngine.Interfaces; +using OpenSim.Region.ScriptEngine.Shared.Api.Interfaces; +using integer = OpenSim.Region.ScriptEngine.Shared.LSL_Types.LSLInteger; +using key = System.String; +using vector = OpenSim.Region.ScriptEngine.Shared.LSL_Types.Vector3; +using rotation = OpenSim.Region.ScriptEngine.Shared.LSL_Types.Quaternion; + +namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase +{ + public partial class ScriptBaseClass : MarshalByRefObject + { + public ILSL_Api m_LSL_Functions; + + public void ApiTypeLSL(IScriptApi api) + { + if(!(api is ILSL_Api)) + return; + + m_LSL_Functions = (ILSL_Api)api; + } + + public void state(string newState) + { + m_LSL_Functions.state(newState); + } + + // + // Script functions + // + public void llSay(int channelID, string text) + { + m_LSL_Functions.llSay(channelID, text); + } + + public double llSin(double f) + { + return m_LSL_Functions.llSin(f); + } + + public double llCos(double f) + { + return m_LSL_Functions.llCos(f); + } + + public double llTan(double f) + { + return m_LSL_Functions.llTan(f); + } + + public double llAtan2(double x, double y) + { + return m_LSL_Functions.llAtan2(x, y); + } + + public double llSqrt(double f) + { + return m_LSL_Functions.llSqrt(f); + } + + public double llPow(double fbase, double fexponent) + { + return m_LSL_Functions.llPow(fbase, fexponent); + } + + public LSL_Types.LSLInteger llAbs(int i) + { + return m_LSL_Functions.llAbs(i); + } + + public double llFabs(double f) + { + return m_LSL_Functions.llFabs(f); + } + + public double llFrand(double mag) + { + return m_LSL_Functions.llFrand(mag); + } + + public LSL_Types.LSLInteger llFloor(double f) + { + return m_LSL_Functions.llFloor(f); + } + + public LSL_Types.LSLInteger llCeil(double f) + { + return m_LSL_Functions.llCeil(f); + } + + public LSL_Types.LSLInteger llRound(double f) + { + return m_LSL_Functions.llRound(f); + } + + public double llVecMag(vector v) + { + return m_LSL_Functions.llVecMag(v); + } + + public vector llVecNorm(vector v) + { + return m_LSL_Functions.llVecNorm(v); + } + + public double llVecDist(vector a, vector b) + { + return m_LSL_Functions.llVecDist(a, b); + } + + public vector llRot2Euler(rotation r) + { + return m_LSL_Functions.llRot2Euler(r); + } + + public rotation llEuler2Rot(vector v) + { + return m_LSL_Functions.llEuler2Rot(v); + } + + public rotation llAxes2Rot(vector fwd, vector left, vector up) + { + return m_LSL_Functions.llAxes2Rot(fwd, left, up); + } + + public vector llRot2Fwd(rotation r) + { + return m_LSL_Functions.llRot2Fwd(r); + } + + public vector llRot2Left(rotation r) + { + return m_LSL_Functions.llRot2Left(r); + } + + public vector llRot2Up(rotation r) + { + return m_LSL_Functions.llRot2Up(r); + } + + public rotation llRotBetween(vector start, vector end) + { + return m_LSL_Functions.llRotBetween(start, end); + } + + public void llWhisper(int channelID, string text) + { + m_LSL_Functions.llWhisper(channelID, text); + } + + public void llShout(int channelID, string text) + { + m_LSL_Functions.llShout(channelID, text); + } + + public void llRegionSay(int channelID, string text) + { + m_LSL_Functions.llRegionSay(channelID, text); + } + + public LSL_Types.LSLInteger llListen(int channelID, string name, string ID, string msg) + { + return m_LSL_Functions.llListen(channelID, name, ID, msg); + } + + public void llListenControl(int number, int active) + { + m_LSL_Functions.llListenControl(number, active); + } + + public void llListenRemove(int number) + { + m_LSL_Functions.llListenRemove(number); + } + + public void llSensor(string name, string id, int type, double range, double arc) + { + m_LSL_Functions.llSensor(name, id, type, range, arc); + } + + public void llSensorRepeat(string name, string id, int type, double range, double arc, double rate) + { + m_LSL_Functions.llSensorRepeat(name, id, type, range, arc, rate); + } + + public void llSensorRemove() + { + m_LSL_Functions.llSensorRemove(); + } + + public string llDetectedName(int number) + { + return m_LSL_Functions.llDetectedName(number); + } + + public string llDetectedKey(int number) + { + return m_LSL_Functions.llDetectedKey(number); + } + + public string llDetectedOwner(int number) + { + return m_LSL_Functions.llDetectedOwner(number); + } + + public LSL_Types.LSLInteger llDetectedType(int number) + { + return m_LSL_Functions.llDetectedType(number); + } + + public vector llDetectedPos(int number) + { + return m_LSL_Functions.llDetectedPos(number); + } + + public vector llDetectedVel(int number) + { + return m_LSL_Functions.llDetectedVel(number); + } + + public vector llDetectedGrab(int number) + { + return m_LSL_Functions.llDetectedGrab(number); + } + + public rotation llDetectedRot(int number) + { + return m_LSL_Functions.llDetectedRot(number); + } + + public LSL_Types.LSLInteger llDetectedGroup(int number) + { + return m_LSL_Functions.llDetectedGroup(number); + } + + public LSL_Types.LSLInteger llDetectedLinkNumber(int number) + { + return m_LSL_Functions.llDetectedLinkNumber(number); + } + + public void llDie() + { + m_LSL_Functions.llDie(); + } + + public double llGround(vector offset) + { + return m_LSL_Functions.llGround(offset); + } + + public double llCloud(vector offset) + { + return m_LSL_Functions.llCloud(offset); + } + + public vector llWind(vector offset) + { + return m_LSL_Functions.llWind(offset); + } + + public void llSetStatus(int status, int value) + { + m_LSL_Functions.llSetStatus(status, value); + } + + public LSL_Types.LSLInteger llGetStatus(int status) + { + return m_LSL_Functions.llGetStatus(status); + } + + public void llSetScale(vector scale) + { + m_LSL_Functions.llSetScale(scale); + } + + public vector llGetScale() + { + return m_LSL_Functions.llGetScale(); + } + + public void llSetColor(vector color, int face) + { + m_LSL_Functions.llSetColor(color, face); + } + + public double llGetAlpha(int face) + { + return m_LSL_Functions.llGetAlpha(face); + } + + public void llSetAlpha(double alpha, int face) + { + m_LSL_Functions.llSetAlpha(alpha, face); + } + + public vector llGetColor(int face) + { + return m_LSL_Functions.llGetColor(face); + } + + public void llSetTexture(string texture, int face) + { + m_LSL_Functions.llSetTexture(texture, face); + } + + public void llScaleTexture(double u, double v, int face) + { + m_LSL_Functions.llScaleTexture(u, v, face); + } + + public void llOffsetTexture(double u, double v, int face) + { + m_LSL_Functions.llOffsetTexture(u, v, face); + } + + public void llRotateTexture(double rotation, int face) + { + m_LSL_Functions.llRotateTexture(rotation, face); + } + + public string llGetTexture(int face) + { + return m_LSL_Functions.llGetTexture(face); + } + + public void llSetPos(vector pos) + { + m_LSL_Functions.llSetPos(pos); + } + + public vector llGetPos() + { + return m_LSL_Functions.llGetPos(); + } + + public vector llGetLocalPos() + { + return m_LSL_Functions.llGetLocalPos(); + } + + public void llSetRot(rotation rot) + { + m_LSL_Functions.llSetRot(rot); + } + + public rotation llGetRot() + { + return m_LSL_Functions.llGetRot(); + } + + public rotation llGetLocalRot() + { + return m_LSL_Functions.llGetLocalRot(); + } + + public void llSetForce(vector force, int local) + { + m_LSL_Functions.llSetForce(force, local); + } + + public vector llGetForce() + { + return m_LSL_Functions.llGetForce(); + } + + public LSL_Types.LSLInteger llTarget(vector position, double range) + { + return m_LSL_Functions.llTarget(position, range); + } + + public void llTargetRemove(int number) + { + m_LSL_Functions.llTargetRemove(number); + } + + public LSL_Types.LSLInteger llRotTarget(rotation rot, double error) + { + return m_LSL_Functions.llRotTarget(rot, error); + } + + public void llRotTargetRemove(int number) + { + m_LSL_Functions.llRotTargetRemove(number); + } + + public void llMoveToTarget(vector target, double tau) + { + m_LSL_Functions.llMoveToTarget(target, tau); + } + + public void llStopMoveToTarget() + { + m_LSL_Functions.llStopMoveToTarget(); + } + + public void llApplyImpulse(vector force, int local) + { + m_LSL_Functions.llApplyImpulse(force, local); + } + + public void llApplyRotationalImpulse(vector force, int local) + { + m_LSL_Functions.llApplyRotationalImpulse(force, local); + } + + public void llSetTorque(vector torque, int local) + { + m_LSL_Functions.llSetTorque(torque, local); + } + + public vector llGetTorque() + { + return m_LSL_Functions.llGetTorque(); + } + + public void llSetForceAndTorque(vector force, vector torque, int local) + { + m_LSL_Functions.llSetForceAndTorque(force, torque, local); + } + + public vector llGetVel() + { + return m_LSL_Functions.llGetVel(); + } + + public vector llGetAccel() + { + return m_LSL_Functions.llGetAccel(); + } + + public vector llGetOmega() + { + return m_LSL_Functions.llGetOmega(); + } + + public double llGetTimeOfDay() + { + return m_LSL_Functions.llGetTimeOfDay(); + } + + public double llGetWallclock() + { + return m_LSL_Functions.llGetWallclock(); + } + + public double llGetTime() + { + return m_LSL_Functions.llGetTime(); + } + + public void llResetTime() + { + m_LSL_Functions.llResetTime(); + } + + public double llGetAndResetTime() + { + return m_LSL_Functions.llGetAndResetTime(); + } + + public void llSound() + { + m_LSL_Functions.llSound(); + } + + public void llPlaySound(string sound, double volume) + { + m_LSL_Functions.llPlaySound(sound, volume); + } + + public void llLoopSound(string sound, double volume) + { + m_LSL_Functions.llLoopSound(sound, volume); + } + + public void llLoopSoundMaster(string sound, double volume) + { + m_LSL_Functions.llLoopSoundMaster(sound, volume); + } + + public void llLoopSoundSlave(string sound, double volume) + { + m_LSL_Functions.llLoopSoundSlave(sound, volume); + } + + public void llPlaySoundSlave(string sound, double volume) + { + m_LSL_Functions.llPlaySoundSlave(sound, volume); + } + + public void llTriggerSound(string sound, double volume) + { + m_LSL_Functions.llTriggerSound(sound, volume); + } + + public void llStopSound() + { + m_LSL_Functions.llStopSound(); + } + + public void llPreloadSound(string sound) + { + m_LSL_Functions.llPreloadSound(sound); + } + + public string llGetSubString(string src, int start, int end) + { + return m_LSL_Functions.llGetSubString(src, start, end); + } + + public string llDeleteSubString(string src, int start, int end) + { + return m_LSL_Functions.llDeleteSubString(src, start, end); + } + + public string llInsertString(string dst, int position, string src) + { + return m_LSL_Functions.llInsertString(dst, position, src); + } + + public string llToUpper(string source) + { + return m_LSL_Functions.llToUpper(source); + } + + public string llToLower(string source) + { + return m_LSL_Functions.llToLower(source); + } + + public LSL_Types.LSLInteger llGiveMoney(string destination, int amount) + { + return m_LSL_Functions.llGiveMoney(destination, amount); + } + + public void llMakeExplosion() + { + m_LSL_Functions.llMakeExplosion(); + } + + public void llMakeFountain() + { + m_LSL_Functions.llMakeFountain(); + } + + public void llMakeSmoke() + { + m_LSL_Functions.llMakeSmoke(); + } + + public void llMakeFire() + { + m_LSL_Functions.llMakeFire(); + } + + public void llRezObject(string inventory, vector pos, vector vel, rotation rot, int param) + { + m_LSL_Functions.llRezObject(inventory, pos, vel, rot, param); + } + + public void llLookAt(vector target, double strength, double damping) + { + m_LSL_Functions.llLookAt(target, strength, damping); + } + + public void llStopLookAt() + { + m_LSL_Functions.llStopLookAt(); + } + + public void llSetTimerEvent(double sec) + { + m_LSL_Functions.llSetTimerEvent(sec); + } + + public void llSleep(double sec) + { + m_LSL_Functions.llSleep(sec); + } + + public double llGetMass() + { + return m_LSL_Functions.llGetMass(); + } + + public void llCollisionFilter(string name, string id, int accept) + { + m_LSL_Functions.llCollisionFilter(name, id, accept); + } + + public void llTakeControls(int controls, int accept, int pass_on) + { + m_LSL_Functions.llTakeControls(controls, accept, pass_on); + } + + public void llReleaseControls() + { + m_LSL_Functions.llReleaseControls(); + } + + public void llAttachToAvatar(int attachment) + { + m_LSL_Functions.llAttachToAvatar(attachment); + } + + public void llDetachFromAvatar() + { + m_LSL_Functions.llDetachFromAvatar(); + } + + public void llTakeCamera() + { + m_LSL_Functions.llTakeCamera(); + } + + public void llReleaseCamera() + { + m_LSL_Functions.llReleaseCamera(); + } + + public string llGetOwner() + { + return m_LSL_Functions.llGetOwner(); + } + + public void llInstantMessage(string user, string message) + { + m_LSL_Functions.llInstantMessage(user, message); + } + + public void llEmail(string address, string subject, string message) + { + m_LSL_Functions.llEmail(address, subject, message); + } + + public void llGetNextEmail(string address, string subject) + { + m_LSL_Functions.llGetNextEmail(address, subject); + } + + public string llGetKey() + { + return m_LSL_Functions.llGetKey(); + } + + public void llSetBuoyancy(double buoyancy) + { + m_LSL_Functions.llSetBuoyancy(buoyancy); + } + + public void llSetHoverHeight(double height, int water, double tau) + { + m_LSL_Functions.llSetHoverHeight(height, water, tau); + } + + public void llStopHover() + { + m_LSL_Functions.llStopHover(); + } + + public void llMinEventDelay(double delay) + { + m_LSL_Functions.llMinEventDelay(delay); + } + + public void llSoundPreload() + { + m_LSL_Functions.llSoundPreload(); + } + + public void llRotLookAt(rotation target, double strength, double damping) + { + m_LSL_Functions.llRotLookAt(target, strength, damping); + } + + public LSL_Types.LSLInteger llStringLength(string str) + { + return m_LSL_Functions.llStringLength(str); + } + + public void llStartAnimation(string anim) + { + m_LSL_Functions.llStartAnimation(anim); + } + + public void llStopAnimation(string anim) + { + m_LSL_Functions.llStopAnimation(anim); + } + + public void llPointAt() + { + m_LSL_Functions.llPointAt(); + } + + public void llStopPointAt() + { + m_LSL_Functions.llStopPointAt(); + } + + public void llTargetOmega(vector axis, double spinrate, double gain) + { + m_LSL_Functions.llTargetOmega(axis, spinrate, gain); + } + + public LSL_Types.LSLInteger llGetStartParameter() + { + return m_LSL_Functions.llGetStartParameter(); + } + + public void llGodLikeRezObject(string inventory, vector pos) + { + m_LSL_Functions.llGodLikeRezObject(inventory, pos); + } + + public void llRequestPermissions(string agent, int perm) + { + m_LSL_Functions.llRequestPermissions(agent, perm); + } + + public string llGetPermissionsKey() + { + return m_LSL_Functions.llGetPermissionsKey(); + } + + public LSL_Types.LSLInteger llGetPermissions() + { + return m_LSL_Functions.llGetPermissions(); + } + + public LSL_Types.LSLInteger llGetLinkNumber() + { + return m_LSL_Functions.llGetLinkNumber(); + } + + public void llSetLinkColor(int linknumber, vector color, int face) + { + m_LSL_Functions.llSetLinkColor(linknumber, color, face); + } + + public void llCreateLink(string target, int parent) + { + m_LSL_Functions.llCreateLink(target, parent); + } + + public void llBreakLink(int linknum) + { + m_LSL_Functions.llBreakLink(linknum); + } + + public void llBreakAllLinks() + { + m_LSL_Functions.llBreakAllLinks(); + } + + public string llGetLinkKey(int linknum) + { + return m_LSL_Functions.llGetLinkKey(linknum); + } + + public string llGetLinkName(int linknum) + { + return m_LSL_Functions.llGetLinkName(linknum); + } + + public LSL_Types.LSLInteger llGetInventoryNumber(int type) + { + return m_LSL_Functions.llGetInventoryNumber(type); + } + + public string llGetInventoryName(int type, int number) + { + return m_LSL_Functions.llGetInventoryName(type, number); + } + + public void llSetScriptState(string name, int run) + { + m_LSL_Functions.llSetScriptState(name, run); + } + + public double llGetEnergy() + { + return m_LSL_Functions.llGetEnergy(); + } + + public void llGiveInventory(string destination, string inventory) + { + m_LSL_Functions.llGiveInventory(destination, inventory); + } + + public void llRemoveInventory(string item) + { + m_LSL_Functions.llRemoveInventory(item); + } + + public void llSetText(string text, vector color, double alpha) + { + m_LSL_Functions.llSetText(text, color, alpha); + } + + public double llWater(vector offset) + { + return m_LSL_Functions.llWater(offset); + } + + public void llPassTouches(int pass) + { + m_LSL_Functions.llPassTouches(pass); + } + + public string llRequestAgentData(string id, int data) + { + return m_LSL_Functions.llRequestAgentData(id, data); + } + + public string llRequestInventoryData(string name) + { + return m_LSL_Functions.llRequestInventoryData(name); + } + + public void llSetDamage(double damage) + { + m_LSL_Functions.llSetDamage(damage); + } + + public void llTeleportAgentHome(string agent) + { + m_LSL_Functions.llTeleportAgentHome(agent); + } + + public void llModifyLand(int action, int brush) + { + m_LSL_Functions.llModifyLand(action, brush); + } + + public void llCollisionSound(string impact_sound, double impact_volume) + { + m_LSL_Functions.llCollisionSound(impact_sound, impact_volume); + } + + public void llCollisionSprite(string impact_sprite) + { + m_LSL_Functions.llCollisionSprite(impact_sprite); + } + + public string llGetAnimation(string id) + { + return m_LSL_Functions.llGetAnimation(id); + } + + public void llResetScript() + { + m_LSL_Functions.llResetScript(); + } + + public void llMessageLinked(int linknum, int num, string str, string id) + { + m_LSL_Functions.llMessageLinked(linknum, num, str, id); + } + + public void llPushObject(string target, vector impulse, vector ang_impulse, int local) + { + m_LSL_Functions.llPushObject(target, impulse, ang_impulse, local); + } + + public void llPassCollisions(int pass) + { + m_LSL_Functions.llPassCollisions(pass); + } + + public string llGetScriptName() + { + return m_LSL_Functions.llGetScriptName(); + } + + public LSL_Types.LSLInteger llGetNumberOfSides() + { + return m_LSL_Functions.llGetNumberOfSides(); + } + + public rotation llAxisAngle2Rot(vector axis, double angle) + { + return m_LSL_Functions.llAxisAngle2Rot(axis, angle); + } + + public vector llRot2Axis(rotation rot) + { + return m_LSL_Functions.llRot2Axis(rot); + } + + public double llRot2Angle(rotation rot) + { + return m_LSL_Functions.llRot2Angle(rot); + } + + public double llAcos(double val) + { + return m_LSL_Functions.llAcos(val); + } + + public double llAsin(double val) + { + return m_LSL_Functions.llAsin(val); + } + + public double llAngleBetween(rotation a, rotation b) + { + return m_LSL_Functions.llAngleBetween(a, b); + } + + public string llGetInventoryKey(string name) + { + return m_LSL_Functions.llGetInventoryKey(name); + } + + public void llAllowInventoryDrop(int add) + { + m_LSL_Functions.llAllowInventoryDrop(add); + } + + public vector llGetSunDirection() + { + return m_LSL_Functions.llGetSunDirection(); + } + + public vector llGetTextureOffset(int face) + { + return m_LSL_Functions.llGetTextureOffset(face); + } + + public vector llGetTextureScale(int side) + { + return m_LSL_Functions.llGetTextureScale(side); + } + + public double llGetTextureRot(int side) + { + return m_LSL_Functions.llGetTextureRot(side); + } + + public LSL_Types.LSLInteger llSubStringIndex(string source, string pattern) + { + return m_LSL_Functions.llSubStringIndex(source, pattern); + } + + public string llGetOwnerKey(string id) + { + return m_LSL_Functions.llGetOwnerKey(id); + } + + public vector llGetCenterOfMass() + { + return m_LSL_Functions.llGetCenterOfMass(); + } + + public LSL_Types.list llListSort(LSL_Types.list src, int stride, int ascending) + { + return m_LSL_Functions.llListSort(src, stride, ascending); + } + + public LSL_Types.LSLInteger llGetListLength(LSL_Types.list src) + { + return m_LSL_Functions.llGetListLength(src); + } + + public LSL_Types.LSLInteger llList2Integer(LSL_Types.list src, int index) + { + return m_LSL_Functions.llList2Integer(src, index); + } + + public string llList2String(LSL_Types.list src, int index) + { + return m_LSL_Functions.llList2String(src, index); + } + + public string llList2Key(LSL_Types.list src, int index) + { + return m_LSL_Functions.llList2Key(src, index); + } + + public vector llList2Vector(LSL_Types.list src, int index) + { + return m_LSL_Functions.llList2Vector(src, index); + } + + public rotation llList2Rot(LSL_Types.list src, int index) + { + return m_LSL_Functions.llList2Rot(src, index); + } + + public LSL_Types.list llList2List(LSL_Types.list src, int start, int end) + { + return m_LSL_Functions.llList2List(src, start, end); + } + + public LSL_Types.list llDeleteSubList(LSL_Types.list src, int start, int end) + { + return m_LSL_Functions.llDeleteSubList(src, start, end); + } + + public LSL_Types.LSLInteger llGetListEntryType(LSL_Types.list src, int index) + { + return m_LSL_Functions.llGetListEntryType(src, index); + } + + public string llList2CSV(LSL_Types.list src) + { + return m_LSL_Functions.llList2CSV(src); + } + + public LSL_Types.list llCSV2List(string src) + { + return m_LSL_Functions.llCSV2List(src); + } + + public LSL_Types.list llListRandomize(LSL_Types.list src, int stride) + { + return m_LSL_Functions.llListRandomize(src, stride); + } + + public LSL_Types.list llList2ListStrided(LSL_Types.list src, int start, int end, int stride) + { + return m_LSL_Functions.llList2ListStrided(src, start, end, stride); + } + + public vector llGetRegionCorner() + { + return m_LSL_Functions.llGetRegionCorner(); + } + + public LSL_Types.list llListInsertList(LSL_Types.list dest, LSL_Types.list src, int start) + { + return m_LSL_Functions.llListInsertList(dest, src, start); + } + + public LSL_Types.LSLInteger llListFindList(LSL_Types.list src, LSL_Types.list test) + { + return m_LSL_Functions.llListFindList(src, test); + } + + public string llGetObjectName() + { + return m_LSL_Functions.llGetObjectName(); + } + + public void llSetObjectName(string name) + { + m_LSL_Functions.llSetObjectName(name); + } + + public string llGetDate() + { + return m_LSL_Functions.llGetDate(); + } + + public LSL_Types.LSLInteger llEdgeOfWorld(vector pos, vector dir) + { + return m_LSL_Functions.llEdgeOfWorld(pos, dir); + } + + public LSL_Types.LSLInteger llGetAgentInfo(string id) + { + return m_LSL_Functions.llGetAgentInfo(id); + } + + public void llAdjustSoundVolume(double volume) + { + m_LSL_Functions.llAdjustSoundVolume(volume); + } + + public void llSetSoundQueueing(int queue) + { + m_LSL_Functions.llSetSoundQueueing(queue); + } + + public void llSetSoundRadius(double radius) + { + m_LSL_Functions.llSetSoundRadius(radius); + } + + public string llKey2Name(string id) + { + return m_LSL_Functions.llKey2Name(id); + } + + public void llSetTextureAnim(int mode, int face, int sizex, int sizey, double start, double length, double rate) + { + m_LSL_Functions.llSetTextureAnim(mode, face, sizex, sizey, start, length, rate); + } + + public void llTriggerSoundLimited(string sound, double volume, vector top_north_east, vector bottom_south_west) + { + m_LSL_Functions.llTriggerSoundLimited(sound, volume, top_north_east, bottom_south_west); + } + + public void llEjectFromLand(string pest) + { + m_LSL_Functions.llEjectFromLand(pest); + } + + public LSL_Types.list llParseString2List(string str, LSL_Types.list separators, LSL_Types.list spacers) + { + return m_LSL_Functions.llParseString2List(str,separators,spacers); + } + + public LSL_Types.LSLInteger llOverMyLand(string id) + { + return m_LSL_Functions.llOverMyLand(id); + } + + public string llGetLandOwnerAt(vector pos) + { + return m_LSL_Functions.llGetLandOwnerAt(pos); + } + + public string llGetNotecardLine(string name, int line) + { + return m_LSL_Functions.llGetNotecardLine(name, line); + } + + public vector llGetAgentSize(string id) + { + return m_LSL_Functions.llGetAgentSize(id); + } + + public LSL_Types.LSLInteger llSameGroup(string agent) + { + return m_LSL_Functions.llSameGroup(agent); + } + + public void llUnSit(string id) + { + m_LSL_Functions.llUnSit(id); + } + + public vector llGroundSlope(vector offset) + { + return m_LSL_Functions.llGroundSlope(offset); + } + + public vector llGroundNormal(vector offset) + { + return m_LSL_Functions.llGroundNormal(offset); + } + + public vector llGroundContour(vector offset) + { + return m_LSL_Functions.llGroundContour(offset); + } + + public LSL_Types.LSLInteger llGetAttached() + { + return m_LSL_Functions.llGetAttached(); + } + + public LSL_Types.LSLInteger llGetFreeMemory() + { + return m_LSL_Functions.llGetFreeMemory(); + } + + public string llGetRegionName() + { + return m_LSL_Functions.llGetRegionName(); + } + + public double llGetRegionTimeDilation() + { + return m_LSL_Functions.llGetRegionTimeDilation(); + } + + public double llGetRegionFPS() + { + return m_LSL_Functions.llGetRegionFPS(); + } + + public void llParticleSystem(LSL_Types.list rules) + { + m_LSL_Functions.llParticleSystem(rules); + } + + public void llGroundRepel(double height, int water, double tau) + { + m_LSL_Functions.llGroundRepel(height, water, tau); + } + + public void llGiveInventoryList(string destination, string category, LSL_Types.list inventory) + { + m_LSL_Functions.llGiveInventoryList(destination, category, inventory); + } + + public void llSetVehicleType(int type) + { + m_LSL_Functions.llSetVehicleType(type); + } + + public void llSetVehicledoubleParam(int param, double value) + { + m_LSL_Functions.llSetVehicledoubleParam(param, value); + } + + public void llSetVehicleFloatParam(int param, float value) + { + m_LSL_Functions.llSetVehicleFloatParam(param, value); + } + + public void llSetVehicleVectorParam(int param, vector vec) + { + m_LSL_Functions.llSetVehicleVectorParam(param, vec); + } + + public void llSetVehicleRotationParam(int param, rotation rot) + { + m_LSL_Functions.llSetVehicleRotationParam(param, rot); + } + + public void llSetVehicleFlags(int flags) + { + m_LSL_Functions.llSetVehicleFlags(flags); + } + + public void llRemoveVehicleFlags(int flags) + { + m_LSL_Functions.llRemoveVehicleFlags(flags); + } + + public void llSitTarget(vector offset, rotation rot) + { + m_LSL_Functions.llSitTarget(offset, rot); + } + + public string llAvatarOnSitTarget() + { + return m_LSL_Functions.llAvatarOnSitTarget(); + } + + public void llAddToLandPassList(string avatar, double hours) + { + m_LSL_Functions.llAddToLandPassList(avatar, hours); + } + + public void llSetTouchText(string text) + { + m_LSL_Functions.llSetTouchText(text); + } + + public void llSetSitText(string text) + { + m_LSL_Functions.llSetSitText(text); + } + + public void llSetCameraEyeOffset(vector offset) + { + m_LSL_Functions.llSetCameraEyeOffset(offset); + } + + public void llSetCameraAtOffset(vector offset) + { + m_LSL_Functions.llSetCameraAtOffset(offset); + } + + public string llDumpList2String(LSL_Types.list src, string seperator) + { + return m_LSL_Functions.llDumpList2String(src, seperator); + } + + public LSL_Types.LSLInteger llScriptDanger(vector pos) + { + return m_LSL_Functions.llScriptDanger(pos); + } + + public void llDialog(string avatar, string message, LSL_Types.list buttons, int chat_channel) + { + m_LSL_Functions.llDialog(avatar, message, buttons, chat_channel); + } + + public void llVolumeDetect(int detect) + { + m_LSL_Functions.llVolumeDetect(detect); + } + + public void llResetOtherScript(string name) + { + m_LSL_Functions.llResetOtherScript(name); + } + + public LSL_Types.LSLInteger llGetScriptState(string name) + { + return m_LSL_Functions.llGetScriptState(name); + } + + public void llRemoteLoadScript() + { + m_LSL_Functions.llRemoteLoadScript(); + } + + public void llSetRemoteScriptAccessPin(int pin) + { + m_LSL_Functions.llSetRemoteScriptAccessPin(pin); + } + + public void llRemoteLoadScriptPin(string target, string name, int pin, int running, int start_param) + { + m_LSL_Functions.llRemoteLoadScriptPin(target, name, pin, running, start_param); + } + + public void llOpenRemoteDataChannel() + { + m_LSL_Functions.llOpenRemoteDataChannel(); + } + + public string llSendRemoteData(string channel, string dest, int idata, string sdata) + { + return m_LSL_Functions.llSendRemoteData(channel, dest, idata, sdata); + } + + public void llRemoteDataReply(string channel, string message_id, string sdata, int idata) + { + m_LSL_Functions.llRemoteDataReply(channel, message_id, sdata, idata); + } + + public void llCloseRemoteDataChannel(string channel) + { + m_LSL_Functions.llCloseRemoteDataChannel(channel); + } + + public string llMD5String(string src, int nonce) + { + return m_LSL_Functions.llMD5String(src, nonce); + } + + public void llSetPrimitiveParams(LSL_Types.list rules) + { + m_LSL_Functions.llSetPrimitiveParams(rules); + } + + public void llSetLinkPrimitiveParams(int linknumber, LSL_Types.list rules) + { + m_LSL_Functions.llSetLinkPrimitiveParams(linknumber, rules); + } + public string llStringToBase64(string str) + { + return m_LSL_Functions.llStringToBase64(str); + } + + public string llBase64ToString(string str) + { + return m_LSL_Functions.llBase64ToString(str); + } + + public void llXorBase64Strings() + { + m_LSL_Functions.llXorBase64Strings(); + } + + public void llRemoteDataSetRegion() + { + m_LSL_Functions.llRemoteDataSetRegion(); + } + + public double llLog10(double val) + { + return m_LSL_Functions.llLog10(val); + } + + public double llLog(double val) + { + return m_LSL_Functions.llLog(val); + } + + public LSL_Types.list llGetAnimationList(string id) + { + return m_LSL_Functions.llGetAnimationList(id); + } + + public void llSetParcelMusicURL(string url) + { + m_LSL_Functions.llSetParcelMusicURL(url); + } + + public vector llGetRootPosition() + { + return m_LSL_Functions.llGetRootPosition(); + } + + public rotation llGetRootRotation() + { + return m_LSL_Functions.llGetRootRotation(); + } + + public string llGetObjectDesc() + { + return m_LSL_Functions.llGetObjectDesc(); + } + + public void llSetObjectDesc(string desc) + { + m_LSL_Functions.llSetObjectDesc(desc); + } + + public string llGetCreator() + { + return m_LSL_Functions.llGetCreator(); + } + + public string llGetTimestamp() + { + return m_LSL_Functions.llGetTimestamp(); + } + + public void llSetLinkAlpha(int linknumber, double alpha, int face) + { + m_LSL_Functions.llSetLinkAlpha(linknumber, alpha, face); + } + + public LSL_Types.LSLInteger llGetNumberOfPrims() + { + return m_LSL_Functions.llGetNumberOfPrims(); + } + + public string llGetNumberOfNotecardLines(string name) + { + return m_LSL_Functions.llGetNumberOfNotecardLines(name); + } + + public LSL_Types.list llGetBoundingBox(string obj) + { + return m_LSL_Functions.llGetBoundingBox(obj); + } + + public vector llGetGeometricCenter() + { + return m_LSL_Functions.llGetGeometricCenter(); + } + + public LSL_Types.list llGetPrimitiveParams(LSL_Types.list rules) + { + return m_LSL_Functions.llGetPrimitiveParams(rules); + } + + public string llIntegerToBase64(int number) + { + return m_LSL_Functions.llIntegerToBase64(number); + } + + public LSL_Types.LSLInteger llBase64ToInteger(string str) + { + return m_LSL_Functions.llBase64ToInteger(str); + } + + public double llGetGMTclock() + { + return m_LSL_Functions.llGetGMTclock(); + } + + public string llGetSimulatorHostname() + { + return m_LSL_Functions.llGetSimulatorHostname(); + } + + public void llSetLocalRot(rotation rot) + { + m_LSL_Functions.llSetLocalRot(rot); + } + + public LSL_Types.list llParseStringKeepNulls(string src, LSL_Types.list seperators, LSL_Types.list spacers) + { + return m_LSL_Functions.llParseStringKeepNulls(src, seperators, spacers); + } + + public void llRezAtRoot(string inventory, vector position, vector velocity, rotation rot, int param) + { + m_LSL_Functions.llRezAtRoot(inventory, position, velocity, rot, param); + } + + public LSL_Types.LSLInteger llGetObjectPermMask(int mask) + { + return m_LSL_Functions.llGetObjectPermMask(mask); + } + + public void llSetObjectPermMask(int mask, int value) + { + m_LSL_Functions.llSetObjectPermMask(mask, value); + } + + public LSL_Types.LSLInteger llGetInventoryPermMask(string item, int mask) + { + return m_LSL_Functions.llGetInventoryPermMask(item, mask); + } + + public void llSetInventoryPermMask(string item, int mask, int value) + { + m_LSL_Functions.llSetInventoryPermMask(item, mask, value); + } + + public string llGetInventoryCreator(string item) + { + return m_LSL_Functions.llGetInventoryCreator(item); + } + + public void llOwnerSay(string msg) + { + m_LSL_Functions.llOwnerSay(msg); + } + + public string llRequestSimulatorData(string simulator, int data) + { + return m_LSL_Functions.llRequestSimulatorData(simulator, data); + } + + public void llForceMouselook(int mouselook) + { + m_LSL_Functions.llForceMouselook(mouselook); + } + + public double llGetObjectMass(string id) + { + return m_LSL_Functions.llGetObjectMass(id); + } + + public LSL_Types.list llListReplaceList(LSL_Types.list dest, LSL_Types.list src, int start, int end) + { + return m_LSL_Functions.llListReplaceList(dest, src, start, end); + } + + public void llLoadURL(string avatar_id, string message, string url) + { + m_LSL_Functions.llLoadURL(avatar_id, message, url); + } + + public void llParcelMediaCommandList(LSL_Types.list commandList) + { + m_LSL_Functions.llParcelMediaCommandList(commandList); + } + + public void llParcelMediaQuery() + { + m_LSL_Functions.llParcelMediaQuery(); + } + + public LSL_Types.LSLInteger llModPow(int a, int b, int c) + { + return m_LSL_Functions.llModPow(a, b, c); + } + + public LSL_Types.LSLInteger llGetInventoryType(string name) + { + return m_LSL_Functions.llGetInventoryType(name); + } + + public void llSetPayPrice(int price, LSL_Types.list quick_pay_buttons) + { + m_LSL_Functions.llSetPayPrice(price, quick_pay_buttons); + } + + public vector llGetCameraPos() + { + return m_LSL_Functions.llGetCameraPos(); + } + + public rotation llGetCameraRot() + { + return m_LSL_Functions.llGetCameraRot(); + } + + public void llSetPrimURL() + { + m_LSL_Functions.llSetPrimURL(); + } + + public void llRefreshPrimURL() + { + m_LSL_Functions.llRefreshPrimURL(); + } + + public string llEscapeURL(string url) + { + return m_LSL_Functions.llEscapeURL(url); + } + + public string llUnescapeURL(string url) + { + return m_LSL_Functions.llUnescapeURL(url); + } + + public void llMapDestination(string simname, vector pos, vector look_at) + { + m_LSL_Functions.llMapDestination(simname, pos, look_at); + } + + public void llAddToLandBanList(string avatar, double hours) + { + m_LSL_Functions.llAddToLandBanList(avatar, hours); + } + + public void llRemoveFromLandPassList(string avatar) + { + m_LSL_Functions.llRemoveFromLandPassList(avatar); + } + + public void llRemoveFromLandBanList(string avatar) + { + m_LSL_Functions.llRemoveFromLandBanList(avatar); + } + + public void llSetCameraParams(LSL_Types.list rules) + { + m_LSL_Functions.llSetCameraParams(rules); + } + + public void llClearCameraParams() + { + m_LSL_Functions.llClearCameraParams(); + } + + public double llListStatistics(int operation, LSL_Types.list src) + { + return m_LSL_Functions.llListStatistics(operation, src); + } + + public LSL_Types.LSLInteger llGetUnixTime() + { + return m_LSL_Functions.llGetUnixTime(); + } + + public LSL_Types.LSLInteger llGetParcelFlags(vector pos) + { + return m_LSL_Functions.llGetParcelFlags(pos); + } + + public LSL_Types.LSLInteger llGetRegionFlags() + { + return m_LSL_Functions.llGetRegionFlags(); + } + + public string llXorBase64StringsCorrect(string str1, string str2) + { + return m_LSL_Functions.llXorBase64StringsCorrect(str1, str2); + } + + public string llHTTPRequest(string url, LSL_Types.list parameters, string body) + { + return m_LSL_Functions.llHTTPRequest(url, parameters, body); + } + + public void llResetLandBanList() + { + m_LSL_Functions.llResetLandBanList(); + } + + public void llResetLandPassList() + { + m_LSL_Functions.llResetLandPassList(); + } + + public LSL_Types.LSLInteger llGetParcelPrimCount(vector pos, int category, int sim_wide) + { + return m_LSL_Functions.llGetParcelPrimCount(pos, category, sim_wide); + } + + public LSL_Types.list llGetParcelPrimOwners(vector pos) + { + return m_LSL_Functions.llGetParcelPrimOwners(pos); + } + + public LSL_Types.LSLInteger llGetObjectPrimCount(string object_id) + { + return m_LSL_Functions.llGetObjectPrimCount(object_id); + } + + public LSL_Types.LSLInteger llGetParcelMaxPrims(vector pos, int sim_wide) + { + return m_LSL_Functions.llGetParcelMaxPrims(pos, sim_wide); + } + + public LSL_Types.list llGetParcelDetails(vector pos, LSL_Types.list param) + { + return m_LSL_Functions.llGetParcelDetails(pos, param); + } + + public void llSetLinkTexture(int linknumber, string texture, int face) + { + m_LSL_Functions.llSetLinkTexture(linknumber, texture, face); + } + + public string llStringTrim(string src, int type) + { + return m_LSL_Functions.llStringTrim(src, type); + } + + public LSL_Types.list llGetObjectDetails(string id, LSL_Types.list args) + { + return m_LSL_Functions.llGetObjectDetails(id, args); + } + + public double llList2Float(LSL_Types.list src, int index) + { + return m_LSL_Functions.llList2Float(src, index); + } + } +} diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs new file mode 100644 index 0000000..168804d --- /dev/null +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs @@ -0,0 +1,199 @@ +/* + * Copyright (c) Contributors, http://opensimulator.org/ + * See CONTRIBUTORS.TXT for a full list of copyright holders. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the OpenSim Project nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +using System; +using System.Runtime.Remoting.Lifetime; +using System.Threading; +using System.Reflection; +using System.Collections; +using System.Collections.Generic; +using OpenSim.Region.Environment.Interfaces; +using OpenSim.Region.ScriptEngine.Interfaces; +using OpenSim.Region.ScriptEngine.Shared.Api.Interfaces; +using integer = OpenSim.Region.ScriptEngine.Shared.LSL_Types.LSLInteger; +using key = System.String; +using vector = OpenSim.Region.ScriptEngine.Shared.LSL_Types.Vector3; +using rotation = OpenSim.Region.ScriptEngine.Shared.LSL_Types.Quaternion; + +namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase +{ + public partial class ScriptBaseClass : MarshalByRefObject + { + public IOSSL_Api m_OSSL_Functions; + + public void ApiTypeOSSL(IScriptApi api) + { + if(!(api is IOSSL_Api)) + return; + + m_OSSL_Functions = (IOSSL_Api)api; + } + + public void osSetRegionWaterHeight(double height) + { + m_OSSL_Functions.osSetRegionWaterHeight(height); + } + + public double osList2Double(LSL_Types.list src, int index) + { + return m_OSSL_Functions.osList2Double(src, index); + } + + public string osSetDynamicTextureURL(string dynamicID, string contentType, string url, string extraParams, + int timer) + { + return m_OSSL_Functions.osSetDynamicTextureURL(dynamicID, contentType, url, extraParams, timer); + } + + public string osSetDynamicTextureData(string dynamicID, string contentType, string data, string extraParams, + int timer) + { + return m_OSSL_Functions.osSetDynamicTextureData(dynamicID, contentType, data, extraParams, timer); + } + + public string osSetDynamicTextureURLBlend(string dynamicID, string contentType, string url, string extraParams, + int timer, int alpha) + { + return m_OSSL_Functions.osSetDynamicTextureURLBlend(dynamicID, contentType, url, extraParams, timer, alpha); + } + + public string osSetDynamicTextureDataBlend(string dynamicID, string contentType, string data, string extraParams, + int timer, int alpha) + { + return m_OSSL_Functions.osSetDynamicTextureDataBlend(dynamicID, contentType, data, extraParams, timer, alpha); + } + + public double osTerrainGetHeight(int x, int y) + { + return m_OSSL_Functions.osTerrainGetHeight(x, y); + } + + public int osTerrainSetHeight(int x, int y, double val) + { + return m_OSSL_Functions.osTerrainSetHeight(x, y, val); + } + + public int osRegionRestart(double seconds) + { + return m_OSSL_Functions.osRegionRestart(seconds); + } + + public void osRegionNotice(string msg) + { + m_OSSL_Functions.osRegionNotice(msg); + } + + public bool osConsoleCommand(string Command) + { + return m_OSSL_Functions.osConsoleCommand(Command); + } + + public void osSetParcelMediaURL(string url) + { + m_OSSL_Functions.osSetParcelMediaURL(url); + } + + public void osSetPrimFloatOnWater(int floatYN) + { + m_OSSL_Functions.osSetPrimFloatOnWater(floatYN); + } + + // Animation Functions + + public void osAvatarPlayAnimation(string avatar, string animation) + { + m_OSSL_Functions.osAvatarPlayAnimation(avatar, animation); + } + + public void osAvatarStopAnimation(string avatar, string animation) + { + m_OSSL_Functions.osAvatarStopAnimation(avatar, animation); + } + + + //Texture Draw functions + + public string osMovePen(string drawList, int x, int y) + { + return m_OSSL_Functions.osMovePen(drawList, x, y); + } + + public string osDrawLine(string drawList, int startX, int startY, int endX, int endY) + { + return m_OSSL_Functions.osDrawLine(drawList, startX, startY, endX, endY); + } + + public string osDrawLine(string drawList, int endX, int endY) + { + return m_OSSL_Functions.osDrawLine(drawList, endX, endY); + } + + public string osDrawText(string drawList, string text) + { + return m_OSSL_Functions.osDrawText(drawList, text); + } + + public string osDrawEllipse(string drawList, int width, int height) + { + return m_OSSL_Functions.osDrawEllipse(drawList, width, height); + } + + public string osDrawRectangle(string drawList, int width, int height) + { + return m_OSSL_Functions.osDrawRectangle(drawList, width, height); + } + + public string osDrawFilledRectangle(string drawList, int width, int height) + { + return m_OSSL_Functions.osDrawFilledRectangle(drawList, width, height); + } + + public string osSetFontSize(string drawList, int fontSize) + { + return m_OSSL_Functions.osSetFontSize(drawList, fontSize); + } + + public string osSetPenSize(string drawList, int penSize) + { + return m_OSSL_Functions.osSetPenSize(drawList, penSize); + } + + public string osSetPenColour(string drawList, string colour) + { + return m_OSSL_Functions.osSetPenColour(drawList, colour); + } + + public string osDrawImage(string drawList, int width, int height, string imageUrl) + { + return m_OSSL_Functions.osDrawImage(drawList, width, height, imageUrl); + } + public void osSetStateEvents(int events) + { + m_OSSL_Functions.osSetStateEvents(events); + } + } +} diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OpenSim.Region.ScriptEngine.Shared.Api.Runtime.csproj b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OpenSim.Region.ScriptEngine.Shared.Api.Runtime.csproj new file mode 100644 index 0000000..870da9f --- /dev/null +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OpenSim.Region.ScriptEngine.Shared.Api.Runtime.csproj @@ -0,0 +1,161 @@ + + + Local + 9.0.21022 + 2.0 + {21BC44EA-0000-0000-0000-000000000000} + Debug + AnyCPU + + + + OpenSim.Region.ScriptEngine.Shared.Api.Runtime + JScript + Grid + IE50 + false + Library + + OpenSim.Region.ScriptEngine.Shared.Api.Runtime + + + + + + False + 285212672 + False + + + TRACE;DEBUG + + True + 4096 + False + ..\..\..\..\..\..\bin\ + False + False + False + 4 + + + + False + 285212672 + False + + + TRACE + + False + 4096 + True + ..\..\..\..\..\..\bin\ + False + False + False + 4 + + + + + ..\..\..\..\..\..\bin\Axiom.MathLib.dll + False + + + ..\..\..\..\..\..\bin\libsecondlife.dll + False + + + ..\..\..\..\..\..\bin\log4net.dll + False + + + ..\..\..\..\..\..\bin\Nini.dll + False + + + ..\..\..\..\..\..\bin\Nini.dll + False + + + ..\..\..\..\..\..\bin\RAIL.dll + False + + + System.dll + False + + + System.Data.dll + False + + + System.Web.dll + False + + + System.Xml.dll + False + + + + + OpenSim + {438A9556-0000-0000-0000-000000000000} + {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + False + + + OpenSim.Framework + {8ACA2445-0000-0000-0000-000000000000} + {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + False + + + OpenSim.Framework.Communications + {CB52B7E7-0000-0000-0000-000000000000} + {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + False + + + OpenSim.Framework.Console + {A7CD0630-0000-0000-0000-000000000000} + {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + False + + + OpenSim.Region.Environment + {DCBA491C-0000-0000-0000-000000000000} + {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + False + + + OpenSim.Region.ScriptEngine.Shared + {D9F1B557-0000-0000-0000-000000000000} + {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + False + + + + + Code + + + Code + + + Code + + + Code + + + + + + + + + + diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OpenSim.Region.ScriptEngine.Shared.Api.Runtime.csproj.user b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OpenSim.Region.ScriptEngine.Shared.Api.Runtime.csproj.user new file mode 100644 index 0000000..c28f556 --- /dev/null +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OpenSim.Region.ScriptEngine.Shared.Api.Runtime.csproj.user @@ -0,0 +1,12 @@ + + + Debug + AnyCPU + C:\Data\OpenSim\bin\ + 9.0.21022 + ProjectFiles + 0 + + + + diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OpenSim.Region.ScriptEngine.Shared.Api.Runtime.dll.build b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OpenSim.Region.ScriptEngine.Shared.Api.Runtime.dll.build new file mode 100644 index 0000000..c3af05c --- /dev/null +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OpenSim.Region.ScriptEngine.Shared.Api.Runtime.dll.build @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OpenSim.Region.ScriptEngine.Shared.Api.Runtime.mdp b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OpenSim.Region.ScriptEngine.Shared.Api.Runtime.mdp new file mode 100644 index 0000000..37bedfc --- /dev/null +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OpenSim.Region.ScriptEngine.Shared.Api.Runtime.mdp @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/ScriptBase.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/ScriptBase.cs new file mode 100644 index 0000000..aa2c9c2 --- /dev/null +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/ScriptBase.cs @@ -0,0 +1,124 @@ +/* + * Copyright (c) Contributors, http://opensimulator.org/ + * See CONTRIBUTORS.TXT for a full list of copyright holders. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the OpenSim Project nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +using System; +using System.Runtime.Remoting.Lifetime; +using System.Threading; +using System.Reflection; +using System.Collections; +using System.Collections.Generic; +using OpenSim.Region.ScriptEngine.Interfaces; +using OpenSim.Region.ScriptEngine.Shared; + +namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase +{ + public partial class ScriptBaseClass : MarshalByRefObject, IScript + { + private Dictionary inits = new Dictionary(); + + public ScriptBaseClass() + { + MethodInfo[] myArrayMethodInfo = GetType().GetMethods(BindingFlags.Public|BindingFlags.Instance); + + foreach(MethodInfo mi in myArrayMethodInfo) + { + if(mi.Name.Length > 7 && mi.Name.Substring(0, 7) == "ApiType") + { + string type=mi.Name.Substring(7); + inits[type]=mi; + } + } + } + + public string[] GetApis() + { + string[] apis = new string[inits.Count]; + inits.Keys.CopyTo(apis, 0); + return apis; + } + + public void InitApi(string api, IScriptApi data) + { + if(!inits.ContainsKey(api)) + return; + + MethodInfo mi = inits[api]; + + Object[] args = new Object[1]; + args[0] = data; + + mi.Invoke(this, args); + } + + private Dictionary m_InitialValues = + new Dictionary(); + private Dictionary m_Fields = + new Dictionary(); + + public Dictionary GetVars() + { + Dictionary vars = new Dictionary(); + + if (m_Fields == null) + return vars; + + m_Fields.Clear(); + + Type t = GetType(); + + FieldInfo[] fields = t.GetFields(BindingFlags.NonPublic | + BindingFlags.Public | + BindingFlags.Instance | + BindingFlags.DeclaredOnly); + + foreach (FieldInfo field in fields) + { + m_Fields[field.Name]=field; + + vars[field.Name]=field.GetValue(this); + } + + return vars; + } + + public void SetVars(Dictionary vars) + { + foreach (KeyValuePair var in vars) + { + if (m_Fields.ContainsKey(var.Key)) + { + m_Fields[var.Key].SetValue(this, var.Value); + } + } + } + + public void ResetVars() + { + SetVars(m_InitialValues); + } + } +} diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/YieldProlog/Atom.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/YieldProlog/Atom.cs new file mode 100644 index 0000000..27ab04e --- /dev/null +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/YieldProlog/Atom.cs @@ -0,0 +1,218 @@ +/* + * Copyright (C) 2007-2008, Jeff Thompson + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the copyright holder nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +using System; +using System.Collections.Generic; +using System.Text; + +namespace OpenSim.Region.ScriptEngine.Shared.YieldProlog +{ + public class Atom : IUnifiable + { + private static Dictionary _atomStore = new Dictionary(); + public readonly string _name; + public readonly Atom _module; + + /// + /// You should not call this constructor, but use Atom.a instead. + /// + /// + /// + private Atom(string name, Atom module) + { + _name = name; + _module = module; + } + + /// + /// Return the unique Atom object for name where module is null. You should use this to create + /// an Atom instead of calling the Atom constructor. + /// + /// + /// + public static Atom a(string name) + { + Atom atom; + if (!_atomStore.TryGetValue(name, out atom)) + { + atom = new Atom(name, null); + _atomStore[name] = atom; + } + return atom; + } + + /// + /// Return an Atom object with the name and module. If module is null or Atom.NIL, + /// this behaves like Atom.a(name) and returns the unique object where the module is null. + /// If module is not null or Atom.NIL, this may or may not be the same object as another Atom + /// with the same name and module. + /// + /// + /// + /// + public static Atom a(string name, Atom module) + { + if (module == null || module == Atom.NIL) + return a(name); + return new Atom(name, module); + } + + /// + /// If Obj is an Atom unify its _module with Module. If the Atom's _module is null, use Atom.NIL. + /// + /// + /// + /// + public static IEnumerable module(object Obj, object Module) + { + Obj = YP.getValue(Obj); + if (Obj is Atom) + { + if (((Atom)Obj)._module == null) + return YP.unify(Module, Atom.NIL); + else + return YP.unify(Module, ((Atom)Obj)._module); + } + return YP.fail(); + } + + public static readonly Atom NIL = Atom.a("[]"); + public static readonly Atom DOT = Atom.a("."); + public static readonly Atom F = Atom.a("f"); + public static readonly Atom SLASH = Atom.a("/"); + public static readonly Atom HAT = Atom.a("^"); + public static readonly Atom RULE = Atom.a(":-"); + + public IEnumerable unify(object arg) + { + arg = YP.getValue(arg); + if (arg is Atom) + return Equals(arg) ? YP.succeed() : YP.fail(); + else if (arg is Variable) + return ((Variable)arg).unify(this); + else + return YP.fail(); + } + + public void addUniqueVariables(List variableSet) + { + // Atom does not contain variables. + } + + public object makeCopy(Variable.CopyStore copyStore) + { + // Atom does not contain variables that need to be copied. + return this; + } + + public bool termEqual(object term) + { + return Equals(YP.getValue(term)); + } + + public bool ground() + { + // Atom is always ground. + return true; + } + + public override bool Equals(object obj) + { + if (obj is Atom) + { + if (_module == null && ((Atom)obj)._module == null) + // When _declaringClass is null, we always use an identical object from _atomStore. + return this == obj; + // Otherwise, ignore _declaringClass and do a normal string compare on the _name. + return _name == ((Atom)obj)._name; + } + return false; + } + + public override string ToString() + { + return _name; + } + + public override int GetHashCode() + { + // Debug: need to check _declaringClass. + return _name.GetHashCode(); + } + + public string toQuotedString() + { + if (_name.Length == 0) + return "''"; + else if (this == Atom.NIL) + return "[]"; + + StringBuilder result = new StringBuilder(_name.Length); + bool useQuotes = false; + foreach (char c in _name) + { + int cInt = (int)c; + if (c == '\'') + { + result.Append("''"); + useQuotes = true; + } + else if (c == '_' || cInt >= (int)'a' && cInt <= (int)'z' || + cInt >= (int)'A' && cInt <= (int)'Z' || cInt >= (int)'0' && cInt <= (int)'9') + result.Append(c); + else + { + // Debug: Need to handle non-printable chars. + result.Append(c); + useQuotes = true; + } + } + + if (!useQuotes && (int)_name[0] >= (int)'a' && (int)_name[0] <= (int)'z') + return result.ToString(); + else + { + // Surround in single quotes. + result.Append('\''); + return "'" + result; + } + } + + /// + /// Return true if _name is lexicographically less than atom._name. + /// + /// + /// + public bool lessThan(Atom atom) + { + return _name.CompareTo(atom._name) < 0; + } + } +} diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/YieldProlog/BagofAnswers.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/YieldProlog/BagofAnswers.cs new file mode 100644 index 0000000..70c1b5a --- /dev/null +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/YieldProlog/BagofAnswers.cs @@ -0,0 +1,234 @@ +/* + * Copyright (C) 2007-2008, Jeff Thompson + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the copyright holder nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +using System; +using System.Collections; +using System.Collections.Generic; + +namespace OpenSim.Region.ScriptEngine.Shared.YieldProlog +{ + /// + /// A BagofAnswers holds answers for bagof and setof. + /// + public class BagofAnswers + { + private object _template; + private Variable[] _freeVariables; + private Dictionary> _bagForFreeVariables; + private List _findallBagArray; + private static TermArrayEqualityComparer _termArrayEqualityComparer = + new TermArrayEqualityComparer(); + + /// + /// To get the free variables, split off any existential qualifiers from Goal such as the X in + /// "X ^ f(Y)", get the set of unbound variables in Goal that are not qualifiers, then remove + /// the unbound variables that are qualifiers as well as the unbound variables in Template. + /// + /// + /// + public BagofAnswers(object Template, object Goal) + { + _template = Template; + + // First get the set of variables that are not free variables. + List variableSet = new List(); + YP.addUniqueVariables(Template, variableSet); + object UnqualifiedGoal = YP.getValue(Goal); + while (UnqualifiedGoal is Functor2 && ((Functor2)UnqualifiedGoal)._name == Atom.HAT) + { + YP.addUniqueVariables(((Functor2)UnqualifiedGoal)._arg1, variableSet); + UnqualifiedGoal = YP.getValue(((Functor2)UnqualifiedGoal)._arg2); + } + + // Remember how many non-free variables there are so we can find the unique free variables + // that are added. + int nNonFreeVariables = variableSet.Count; + YP.addUniqueVariables(UnqualifiedGoal, variableSet); + int nFreeVariables = variableSet.Count - nNonFreeVariables; + if (nFreeVariables == 0) + { + // There were no free variables added, so we won't waste time with _bagForFreeVariables. + _freeVariables = null; + _findallBagArray = new List(); + } + else + { + // Copy the free variables. + _freeVariables = new Variable[nFreeVariables]; + for (int i = 0; i < nFreeVariables; ++i) + _freeVariables[i] = variableSet[i + nNonFreeVariables]; + + _bagForFreeVariables = new Dictionary>(_termArrayEqualityComparer); + } + } + + public void add() + { + if (_freeVariables == null) + // The goal has bound the values in _template but we don't bother with _freeVariables. + _findallBagArray.Add(YP.makeCopy(_template, new Variable.CopyStore())); + else + { + // The goal has bound the values in _template and _freeVariables. + // Find the entry for this set of _freeVariables values. + object[] freeVariableValues = new object[_freeVariables.Length]; + for (int i = 0; i < _freeVariables.Length; ++i) + freeVariableValues[i] = YP.getValue(_freeVariables[i]); + List bagArray; + if (!_bagForFreeVariables.TryGetValue(freeVariableValues, out bagArray)) + { + bagArray = new List(); + _bagForFreeVariables[freeVariableValues] = bagArray; + } + + // Now copy the template and add to the bag for the freeVariables values. + bagArray.Add(YP.makeCopy(_template, new Variable.CopyStore())); + } + } + + /// + /// For each result, unify the _freeVariables and unify bagArrayVariable with the associated bag. + /// + /// this is unified with the List of matches for template that + /// corresponds to the bindings for freeVariables. Be very careful: this does not unify with a Prolog + /// list. + /// + public IEnumerable resultArray(Variable bagArrayVariable) + { + if (_freeVariables == null) + { + // No unbound free variables, so we only filled one bag. If empty, bagof fails. + if (_findallBagArray.Count > 0) + { + foreach (bool l1 in bagArrayVariable.unify(_findallBagArray)) + yield return false; + } + } + else + { + foreach (KeyValuePair> valuesAndBag in _bagForFreeVariables) + { + foreach (bool l1 in YP.unifyArrays(_freeVariables, valuesAndBag.Key)) + { + foreach (bool l2 in bagArrayVariable.unify(valuesAndBag.Value)) + yield return false; + } + // Debug: Should we free memory of the answers already returned? + } + } + } + + /// + /// For each result, unify the _freeVariables and unify Bag with the associated bag. + /// + /// + /// + public IEnumerable result(object Bag) + { + Variable bagArrayVariable = new Variable(); + foreach (bool l1 in resultArray(bagArrayVariable)) + { + foreach (bool l2 in YP.unify(Bag, ListPair.make((List)bagArrayVariable.getValue()))) + yield return false; + } + } + + /// + /// For each result, unify the _freeVariables and unify Bag with the associated bag which is sorted + /// with duplicates removed, as in setof. + /// + /// + /// + public IEnumerable resultSet(object Bag) + { + Variable bagArrayVariable = new Variable(); + foreach (bool l1 in resultArray(bagArrayVariable)) + { + List bagArray = (List)bagArrayVariable.getValue(); + YP.sortArray(bagArray); + foreach (bool l2 in YP.unify(Bag, ListPair.makeWithoutRepeatedTerms(bagArray))) + yield return false; + } + } + + public static IEnumerable bagofArray + (object Template, object Goal, IEnumerable goalIterator, Variable bagArrayVariable) + { + BagofAnswers bagOfAnswers = new BagofAnswers(Template, Goal); + foreach (bool l1 in goalIterator) + bagOfAnswers.add(); + return bagOfAnswers.resultArray(bagArrayVariable); + } + + public static IEnumerable bagof + (object Template, object Goal, IEnumerable goalIterator, object Bag) + { + BagofAnswers bagOfAnswers = new BagofAnswers(Template, Goal); + foreach (bool l1 in goalIterator) + bagOfAnswers.add(); + return bagOfAnswers.result(Bag); + } + + public static IEnumerable setof + (object Template, object Goal, IEnumerable goalIterator, object Bag) + { + BagofAnswers bagOfAnswers = new BagofAnswers(Template, Goal); + foreach (bool l1 in goalIterator) + bagOfAnswers.add(); + return bagOfAnswers.resultSet(Bag); + } + + /// + /// A TermArrayEqualityComparer implements IEqualityComparer to compare two object arrays using YP.termEqual. + /// + private class TermArrayEqualityComparer : IEqualityComparer + { + public bool Equals(object[] array1, object[] array2) + { + if (array1.Length != array2.Length) + return false; + for (int i = 0; i < array1.Length; ++i) + { + if (!YP.termEqual(array1[i], array2[i])) + return false; + } + return true; + } + + public int GetHashCode(object[] array) + { + int hashCode = 0; + for (int i = 0; i < array.Length; ++i) + hashCode ^= array[i].GetHashCode(); + return hashCode; + } + } + } +} diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/YieldProlog/FindallAnswers.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/YieldProlog/FindallAnswers.cs new file mode 100644 index 0000000..28709e1 --- /dev/null +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/YieldProlog/FindallAnswers.cs @@ -0,0 +1,103 @@ +/* + * Copyright (C) 2007-2008, Jeff Thompson + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the copyright holder nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +using System; +using System.Collections; +using System.Collections.Generic; + +namespace OpenSim.Region.ScriptEngine.Shared.YieldProlog +{ + /// + /// A FindallAnswers holds answers for findall. + /// + public class FindallAnswers + { + private object _template; + private List _bagArray; + + public FindallAnswers(object Template) + { + _template = Template; + _bagArray = new List(); + } + + public void add() + { + _bagArray.Add(YP.makeCopy(_template, new Variable.CopyStore())); + } + + public List resultArray() + { + return _bagArray; + } + + /// + /// Unify Bag with the result. This frees the internal answers, so you can only call this once. + /// + /// + /// + public IEnumerable result(object Bag) + { + object result = ListPair.make(_bagArray); + // Try to free the memory. + _bagArray = null; + return YP.unify(Bag, result); + } + + /// + /// This is a simplified findall when the goal is a single call. + /// + /// + /// + /// + /// + public static IEnumerable findall(object Template, IEnumerable goal, object Bag) + { + FindallAnswers findallAnswers = new FindallAnswers(Template); + foreach (bool l1 in goal) + findallAnswers.add(); + return findallAnswers.result(Bag); + } + + /// + /// Like findall, except return an array of the results. + /// + /// + /// + /// + public static List findallArray(object Template, IEnumerable goal) + { + FindallAnswers findallAnswers = new FindallAnswers(Template); + foreach (bool l1 in goal) + findallAnswers.add(); + return findallAnswers.resultArray(); + } + } +} diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/YieldProlog/Functor.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/YieldProlog/Functor.cs new file mode 100644 index 0000000..8ef8de0 --- /dev/null +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/YieldProlog/Functor.cs @@ -0,0 +1,188 @@ +/* + * Copyright (C) 2007-2008, Jeff Thompson + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the copyright holder nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +using System; +using System.Collections.Generic; + +namespace OpenSim.Region.ScriptEngine.Shared.YieldProlog +{ + public class Functor : IUnifiable + { + public readonly Atom _name; + public readonly object[] _args; + + public Functor(Atom name, object[] args) + { + if (args.Length <= 3) + { + if (args.Length == 0) + throw new Exception("For arity 0 functor, just use name as an Atom"); + else if (args.Length == 1) + throw new Exception("For arity 1 functor, use Functor1"); + else if (args.Length == 2) + throw new Exception("For arity 2 functor, use Functor2"); + else if (args.Length == 3) + throw new Exception("For arity 3 functor, use Functor3"); + else + // (This shouldn't happen, but include it for completeness. + throw new Exception("Cannot create a Functor of arity " + args.Length); + } + + _name = name; + _args = args; + } + + public Functor(string name, object[] args) + : this(Atom.a(name), args) + { + } + + /// + /// Return an Atom, Functor1, Functor2, Functor3 or Functor depending on the + /// length of args. + /// Note that this is different than the Functor constructor which requires + /// the length of args to be greater than 3. + /// + /// + /// + /// + public static object make(Atom name, object[] args) + { + if (args.Length <= 0) + return name; + else if (args.Length == 1) + return new Functor1(name, args[0]); + else if (args.Length == 2) + return new Functor2(name, args[0], args[1]); + else if (args.Length == 3) + return new Functor3(name, args[0], args[1], args[2]); + else + return new Functor(name, args); + } + + /// + /// Call the main make, first converting name to an Atom. + /// + /// + /// + /// + public static object make(string name, object[] args) + { + return make(Atom.a(name), args); + } + + public IEnumerable unify(object arg) + { + arg = YP.getValue(arg); + if (arg is Functor) + { + Functor argFunctor = (Functor)arg; + if (_name.Equals(argFunctor._name)) + return YP.unifyArrays(_args, argFunctor._args); + else + return YP.fail(); + } + else if (arg is Variable) + return ((Variable)arg).unify(this); + else + return YP.fail(); + } + + public override string ToString() + { + string result = _name + "(" + YP.getValue(_args[0]); + for (int i = 1; i < _args.Length; ++i) + result += ", " + YP.getValue(_args[i]); + result += ")"; + return result; + } + + public bool termEqual(object term) + { + term = YP.getValue(term); + if (term is Functor) + { + Functor termFunctor = (Functor)term; + if (_name.Equals(termFunctor._name) && _args.Length == termFunctor._args.Length) + { + for (int i = 0; i < _args.Length; ++i) + { + if (!YP.termEqual(_args[i], termFunctor._args[i])) + return false; + } + return true; + } + } + return false; + } + + public bool lessThan(Functor functor) + { + // Do the equal check first since it is faster. + if (!_name.Equals(functor._name)) + return _name.lessThan(functor._name); + + if (_args.Length != functor._args.Length) + return _args.Length < functor._args.Length; + + for (int i = 0; i < _args.Length; ++i) + { + if (!YP.termEqual(_args[i], functor._args[i])) + return YP.termLessThan(_args[i], functor._args[i]); + } + + return false; + } + + public bool ground() + { + for (int i = 0; i < _args.Length; ++i) + { + if (!YP.ground(_args[i])) + return false; + } + return true; + } + + public void addUniqueVariables(List variableSet) + { + for (int i = 0; i < _args.Length; ++i) + YP.addUniqueVariables(_args[i], variableSet); + } + + public object makeCopy(Variable.CopyStore copyStore) + { + object[] argsCopy = new object[_args.Length]; + for (int i = 0; i < _args.Length; ++i) + argsCopy[i] = YP.makeCopy(_args[i], copyStore); + return new Functor(_name, argsCopy); + } + } +} diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/YieldProlog/Functor1.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/YieldProlog/Functor1.cs new file mode 100644 index 0000000..3c0c1c4 --- /dev/null +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/YieldProlog/Functor1.cs @@ -0,0 +1,111 @@ +/* + * Copyright (C) 2007-2008, Jeff Thompson + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the copyright holder nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +using System; +using System.Collections.Generic; + +namespace OpenSim.Region.ScriptEngine.Shared.YieldProlog +{ + public class Functor1 : IUnifiable + { + public readonly Atom _name; + public readonly object _arg1; + + public Functor1(Atom name, object arg1) + { + _name = name; + _arg1 = arg1; + } + + public Functor1(string name, object arg1) + : this(Atom.a(name), arg1) + { + } + + public IEnumerable unify(object arg) + { + arg = YP.getValue(arg); + if (arg is Functor1) + { + Functor1 argFunctor = (Functor1)arg; + if (_name.Equals(argFunctor._name)) + { + foreach (bool l1 in YP.unify(_arg1, argFunctor._arg1)) + yield return false; + } + } + else if (arg is Variable) + { + foreach (bool l1 in ((Variable)arg).unify(this)) + yield return false; + } + } + + public override string ToString() + { + return _name + "(" + YP.getValue(_arg1) + ")"; + } + + public bool termEqual(object term) + { + term = YP.getValue(term); + if (term is Functor1) + { + Functor1 termFunctor = (Functor1)term; + return _name.Equals(termFunctor._name) && YP.termEqual(_arg1, termFunctor._arg1); + } + return false; + } + + public bool lessThan(Functor1 functor) + { + // Do the equal check first since it is faster. + if (!_name.Equals(functor._name)) + return _name.lessThan(functor._name); + + return YP.termLessThan(_arg1, functor._arg1); + } + + public bool ground() + { + return YP.ground(_arg1); + } + + public void addUniqueVariables(List variableSet) + { + YP.addUniqueVariables(_arg1, variableSet); + } + + public object makeCopy(Variable.CopyStore copyStore) + { + return new Functor1(_name, YP.makeCopy(_arg1, copyStore)); + } + } +} diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/YieldProlog/Functor2.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/YieldProlog/Functor2.cs new file mode 100644 index 0000000..596b763 --- /dev/null +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/YieldProlog/Functor2.cs @@ -0,0 +1,154 @@ +/* + * Copyright (C) 2007-2008, Jeff Thompson + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the copyright holder nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +using System; +using System.Collections.Generic; + +namespace OpenSim.Region.ScriptEngine.Shared.YieldProlog +{ + public class Functor2 : IUnifiable + { + public readonly Atom _name; + public readonly object _arg1; + public readonly object _arg2; + + public Functor2(Atom name, object arg1, object arg2) + { + _name = name; + _arg1 = arg1; + _arg2 = arg2; + } + + public Functor2(string name, object arg1, object arg2) + : this(Atom.a(name), arg1, arg2) + { + } + + public IEnumerable unify(object arg) + { + arg = YP.getValue(arg); + if (arg is Functor2) + { + Functor2 argFunctor = (Functor2)arg; + if (_name.Equals(argFunctor._name)) + { + foreach (bool l1 in YP.unify(_arg1, argFunctor._arg1)) + { + foreach (bool l2 in YP.unify(_arg2, argFunctor._arg2)) + yield return false; + } + } + } + else if (arg is Variable) + { + foreach (bool l1 in ((Variable)arg).unify(this)) + yield return false; + } + } + + public override string ToString() + { + if (_name == Atom.DOT) + return listPairToString(this); + else + return _name + "(" + YP.getValue(_arg1) + ", " + YP.getValue(_arg2) + ")"; + } + + public bool termEqual(object term) + { + term = YP.getValue(term); + if (term is Functor2) + { + Functor2 termFunctor = (Functor2)term; + return _name.Equals(termFunctor._name) && YP.termEqual(_arg1, termFunctor._arg1) + && YP.termEqual(_arg2, termFunctor._arg2); + } + return false; + } + + public bool lessThan(Functor2 functor) + { + // Do the equal check first since it is faster. + if (!_name.Equals(functor._name)) + return _name.lessThan(functor._name); + + if (!YP.termEqual(_arg1, functor._arg1)) + return YP.termLessThan(_arg1, functor._arg1); + + return YP.termLessThan(_arg2, functor._arg2); + } + + public bool ground() + { + return YP.ground(_arg1) && YP.ground(_arg2); + } + + public void addUniqueVariables(List variableSet) + { + YP.addUniqueVariables(_arg1, variableSet); + YP.addUniqueVariables(_arg2, variableSet); + } + + public object makeCopy(Variable.CopyStore copyStore) + { + return new Functor2(_name, YP.makeCopy(_arg1, copyStore), + YP.makeCopy(_arg2, copyStore)); + } + + private static string listPairToString(Functor2 listPair) + { + string result = "["; + while (true) + { + object head = YP.getValue(listPair._arg1); + object tail = YP.getValue(listPair._arg2); + if (tail == (object)Atom.NIL) + { + result += head; + break; + } + else if (tail is Functor2 && ((Functor2)tail)._name == Atom.DOT) + { + result += head + ", "; + listPair = (Functor2)tail; + // Loop again. + } + else + { + // The list is not terminated with NIL. + result += head + "|" + tail; + break; + } + } + result += "]"; + return result; + } + } +} diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/YieldProlog/Functor3.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/YieldProlog/Functor3.cs new file mode 100644 index 0000000..041cceb --- /dev/null +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/YieldProlog/Functor3.cs @@ -0,0 +1,133 @@ +/* + * Copyright (C) 2007-2008, Jeff Thompson + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the copyright holder nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +using System; +using System.Collections.Generic; + +namespace OpenSim.Region.ScriptEngine.Shared.YieldProlog +{ + public class Functor3 : IUnifiable + { + public readonly Atom _name; + public readonly object _arg1; + public readonly object _arg2; + public readonly object _arg3; + + public Functor3(Atom name, object arg1, object arg2, object arg3) + { + _name = name; + _arg1 = arg1; + _arg2 = arg2; + _arg3 = arg3; + } + + public Functor3(string name, object arg1, object arg2, object arg3) + : this(Atom.a(name), arg1, arg2, arg3) + { + } + + public IEnumerable unify(object arg) + { + arg = YP.getValue(arg); + if (arg is Functor3) + { + Functor3 argFunctor = (Functor3)arg; + if (_name.Equals(argFunctor._name)) + { + foreach (bool l1 in YP.unify(_arg1, argFunctor._arg1)) + { + foreach (bool l2 in YP.unify(_arg2, argFunctor._arg2)) + { + foreach (bool l3 in YP.unify(_arg3, argFunctor._arg3)) + yield return false; + } + } + } + } + else if (arg is Variable) + { + foreach (bool l1 in ((Variable)arg).unify(this)) + yield return false; + } + } + + public override string ToString() + { + return _name + "(" + YP.getValue(_arg1) + ", " + YP.getValue(_arg2) + ", " + + YP.getValue(_arg3) + ")"; + } + + public bool termEqual(object term) + { + term = YP.getValue(term); + if (term is Functor3) + { + Functor3 termFunctor = (Functor3)term; + return _name.Equals(termFunctor._name) && YP.termEqual(_arg1, termFunctor._arg1) + && YP.termEqual(_arg2, termFunctor._arg2) + && YP.termEqual(_arg3, termFunctor._arg3); + } + return false; + } + + public bool lessThan(Functor3 functor) + { + // Do the equal check first since it is faster. + if (!_name.Equals(functor._name)) + return _name.lessThan(functor._name); + + if (!YP.termEqual(_arg1, functor._arg1)) + return YP.termLessThan(_arg1, functor._arg1); + + if (!YP.termEqual(_arg2, functor._arg2)) + return YP.termLessThan(_arg2, functor._arg2); + + return YP.termLessThan(_arg3, functor._arg3); + } + + public bool ground() + { + return YP.ground(_arg1) && YP.ground(_arg2) && YP.ground(_arg3); + } + + public void addUniqueVariables(List variableSet) + { + YP.addUniqueVariables(_arg1, variableSet); + YP.addUniqueVariables(_arg2, variableSet); + YP.addUniqueVariables(_arg3, variableSet); + } + + public object makeCopy(Variable.CopyStore copyStore) + { + return new Functor3(_name, YP.makeCopy(_arg1, copyStore), + YP.makeCopy(_arg2, copyStore), YP.makeCopy(_arg3, copyStore)); + } + } +} diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/YieldProlog/IndexedAnswers.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/YieldProlog/IndexedAnswers.cs new file mode 100644 index 0000000..1be73f7 --- /dev/null +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/YieldProlog/IndexedAnswers.cs @@ -0,0 +1,288 @@ +/* + * Copyright (C) 2007-2008, Jeff Thompson + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the copyright holder nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +using System; +using System.Collections; +using System.Collections.Generic; + +namespace OpenSim.Region.ScriptEngine.Shared.YieldProlog +{ + /// + /// An IndexedAnswers holds answers to a query based on the values of index arguments. + /// + public class IndexedAnswers : YP.IClause + { + // addAnswer adds the answer here and indexes it later. + private List _allAnswers = new List(); + // The key has the arity of answers with non-null values for each indexed arg. The value + // is a list of the matching answers. The signature is implicit in the pattern on non-null index args. + private Dictionary> _indexedAnswers = + new Dictionary>(); + // Keeps track of whether we have started adding entries to _indexedAnswers for the signature. + private Dictionary _gotAnswersForSignature = new Dictionary(); + private const int MAX_INDEX_ARGS = 31; + + public IndexedAnswers() + { + } + + /// + /// Elements of answer must be ground, since arguments with unbound variables make this + /// into a dynamic rule which we don't index. + /// + /// + public void addAnswer(object[] answer) + { + // Store a copy of the answer array. + object[] answerCopy = new object[answer.Length]; + Variable.CopyStore copyStore = new Variable.CopyStore(); + for (int i = 0; i < answer.Length; ++i) + answerCopy[i] = YP.makeCopy(answer[i], copyStore); + if (copyStore.getNUniqueVariables() > 0) + throw new InvalidOperationException + ("Elements of answer must be ground, but found " + copyStore.getNUniqueVariables() + + " unbound variables"); + _allAnswers.Add(answerCopy); + + // If match has already indexed answers for a signature, we need to add + // this to the existing indexed answers. + foreach (int signature in _gotAnswersForSignature.Keys) + indexAnswerForSignature(answerCopy, signature); + } + + private void indexAnswerForSignature(object[] answer, int signature) + { + // First find out which of the answer values can be used as an index. + object[] indexValues = new object[answer.Length]; + for (int i = 0; i < answer.Length; ++i) + { + // We limit the number of indexed args in a 32-bit signature. + if (i >= MAX_INDEX_ARGS) + indexValues[i] = null; + else + indexValues[i] = getIndexValue(YP.getValue(answer[i])); + } + + // We need an entry in indexArgs from indexValues for each 1 bit in signature. + HashedList indexArgs = new HashedList(indexValues.Length); + for (int i = 0; i < indexValues.Length; ++i) + { + if ((signature & (1 << i)) == 0) + indexArgs.Add(null); + else + { + if (indexValues[i] == null) + // The signature wants an index value here, but we don't have one so + // we can't add it as an answer for this signature. + return; + else + indexArgs.Add(indexValues[i]); + } + } + + // Add the answer to the answers list for indexArgs, creating the entry if needed. + List answers; + if (!_indexedAnswers.TryGetValue(indexArgs, out answers)) + { + answers = new List(); + _indexedAnswers[indexArgs] = answers; + } + answers.Add(answer); + } + + public IEnumerable match(object[] arguments) + { + // Set up indexArgs, up to arg position MAX_INDEX_ARGS. The signature has a 1 bit for + // each non-null index arg. + HashedList indexArgs = new HashedList(arguments.Length); + bool gotAllIndexArgs = true; + int signature = 0; + for (int i = 0; i < arguments.Length; ++i) + { + object indexValue = null; + if (i < MAX_INDEX_ARGS) + { + // We limit the number of args in a 32-bit signature. + indexValue = getIndexValue(YP.getValue(arguments[i])); + if (indexValue != null) + signature += (1 << i); + } + if (indexValue == null) + gotAllIndexArgs = false; + indexArgs.Add(indexValue); + } + + List answers; + if (signature == 0) + // No index args, so we have to match from _allAnswers. + answers = _allAnswers; + else + { + if (!_gotAnswersForSignature.ContainsKey(signature)) + { + // We need to create the entry in _indexedAnswers. + foreach (object[] answer in _allAnswers) + indexAnswerForSignature(answer, signature); + // Mark that we did this signature. + _gotAnswersForSignature[signature] = null; + } + if (!_indexedAnswers.TryGetValue(indexArgs, out answers)) + yield break; + } + + if (gotAllIndexArgs) + { + // All the arguments were already bound, so we don't need to do bindings. + yield return false; + yield break; + } + + // Find matches in answers. + IEnumerator[] iterators = new IEnumerator[arguments.Length]; + foreach (object[] answer in answers) + { + bool gotMatch = true; + int nIterators = 0; + // Try to bind all the arguments. + for (int i = 0; i < arguments.Length; ++i) + { + if (indexArgs[i] != null) + // We already matched this argument by looking up _indexedAnswers. + continue; + + IEnumerator iterator = YP.unify(arguments[i], answer[i]).GetEnumerator(); + iterators[nIterators++] = iterator; + // MoveNext() is true if YP.unify succeeds. + if (!iterator.MoveNext()) + { + gotMatch = false; + break; + } + } + + try + { + if (gotMatch) + yield return false; + } + finally + { + // Manually finalize all the iterators. + for (int i = 0; i < nIterators; ++i) + iterators[i].Dispose(); + } + } + } + + /// + /// A HashedList extends an ArrayList with methods to get a hash and to check equality + /// based on the elements of the list. + /// + public class HashedList : ArrayList + { + private bool _gotHashCode = false; + private int _hashCode; + + public HashedList() + : base() + { + } + + public HashedList(int capacity) + : base(capacity) + { + } + + public HashedList(ICollection c) + : base(c) + { + } + + // Debug: Should override all the other methods that change this. + public override int Add(object value) + { + _gotHashCode = false; + return base.Add(value); + } + + public override int GetHashCode() + { + if (!_gotHashCode) + { + int hashCode = 1; + foreach (object obj in this) + hashCode = 31 * hashCode + (obj == null ? 0 : obj.GetHashCode()); + _hashCode = hashCode; + _gotHashCode = true; + } + return _hashCode; + } + + public override bool Equals(object obj) + { + if (!(obj is ArrayList)) + return false; + + ArrayList objList = (ArrayList)obj; + if (objList.Count != Count) + return false; + + for (int i = 0; i < Count; ++i) + { + object value = objList[i]; + if (value == null) + { + if (this[i] != null) + return false; + } + else + { + if (!value.Equals(this[i])) + return false; + } + } + return true; + } + } + + /// + /// If we keep an index on value, return the value, or null if we don't index it. + /// + /// the term to examine. Assume you already called YP.getValue(value) + /// + public static object getIndexValue(object value) + { + if (value is Atom || value is string || value is Int32 || value is DateTime) + return value; + else + return null; + } + } +} diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/YieldProlog/ListPair.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/YieldProlog/ListPair.cs new file mode 100644 index 0000000..83ace2d --- /dev/null +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/YieldProlog/ListPair.cs @@ -0,0 +1,156 @@ +/* + * Copyright (C) 2007-2008, Jeff Thompson + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the copyright holder nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +using System; +using System.Collections.Generic; + +namespace OpenSim.Region.ScriptEngine.Shared.YieldProlog +{ + public class ListPair : Functor2 + { + public ListPair(object head, object tail) : base(Atom.DOT, head, tail) + { + } + + public static object make(List list) + { + if (list.Count <= 0) + return Atom.NIL; + + object result = Atom.NIL; + // Start from the end. + for (int i = list.Count - 1; i >= 0; --i) + result = new ListPair(list[i], result); + return result; + } + + public static object make(object[] array) + { + if (array.Length <= 0) + return Atom.NIL; + + object result = Atom.NIL; + // Start from the end. + for (int i = array.Length - 1; i >= 0; --i) + result = new ListPair(array[i], result); + return result; + } + + /// + /// Return a ListPair version of array, where repeated elements + /// (according to YP.termEqual) are removed. + /// + /// + /// + public static object makeWithoutRepeatedTerms(object[] array) + { + if (array.Length <= 0) + return Atom.NIL; + + // Start from the end. + object previousTerm = array[array.Length - 1]; + object result = new ListPair(previousTerm, Atom.NIL); + for (int i = array.Length - 2; i >= 0; --i) + { + object term = array[i]; + if (YP.termEqual(term, previousTerm)) + continue; + result = new ListPair(term, result); + previousTerm = term; + } + return result; + } + + /// + /// Return a ListPair version of array, where repeated elements + /// (according to YP.termEqual) are removed. + /// + /// + /// + public static object makeWithoutRepeatedTerms(List array) + { + if (array.Count <= 0) + return Atom.NIL; + + // Start from the end. + object previousTerm = array[array.Count - 1]; + object result = new ListPair(previousTerm, Atom.NIL); + for (int i = array.Count - 2; i >= 0; --i) + { + object term = array[i]; + if (YP.termEqual(term, previousTerm)) + continue; + result = new ListPair(term, result); + previousTerm = term; + } + return result; + } + + public static object make(object element1) + { + return new ListPair(element1, Atom.NIL); + } + + public static object make(object element1, object element2) + { + return new ListPair(element1, new ListPair(element2, Atom.NIL)); + } + + public static object make(object element1, object element2, object element3) + { + return new ListPair(element1, + new ListPair(element2, new ListPair(element3, Atom.NIL))); + } + + /// + /// Return an array of the elements in list or null if it is not + /// a proper list. If list is Atom.NIL, return an array of zero elements. + /// This does not call YP.getValue on each element. + /// + /// + /// + public static object[] toArray(object list) + { + list = YP.getValue(list); + if (list.Equals(Atom.NIL)) + return new object[0]; + + List result = new List(); + for (object element = list; + element is Functor2 && ((Functor2)element)._name == Atom.DOT; + element = YP.getValue(((Functor2)element)._arg2)) + result.Add(((Functor2)element)._arg1); + + if (result.Count <= 0) + return null; + return result.ToArray(); + } + } +} diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/YieldProlog/Parser.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/YieldProlog/Parser.cs new file mode 100644 index 0000000..105b556 --- /dev/null +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/YieldProlog/Parser.cs @@ -0,0 +1,4457 @@ +/* + * Copyright (C) 2007-2008, Jeff Thompson + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the copyright holder nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +using System; +using System.Collections.Generic; + +namespace OpenSim.Region.ScriptEngine.Shared.YieldProlog +{ + public class Parser + { + public static IEnumerable formatError(object Output, object Format, object Arguments) + { + // Debug: Simple implementation for now. + YP.write(Format); + YP.write(Arguments); + YP.nl(); + yield return false; + } + + // Debug: Hand-modify this central predicate to do tail recursion. + public static IEnumerable read_tokens(object arg1, object arg2, object arg3) + { + bool repeat = true; + while (repeat) + { + repeat = false; + { + object C1 = arg1; + object Dict = arg2; + object Tokens = arg3; + Variable C2 = new Variable(); + if (YP.lessThanOrEqual(C1, new ListPair(32, Atom.NIL))) + { + if (YP.greaterThanOrEqual(C1, 0)) + { + foreach (bool l4 in YP.get_code(C2)) + { +#if false + foreach (bool l5 in read_tokens(C2, Dict, Tokens)) + { + yield return false; + } +#endif + arg1 = YP.getValue(C2); + arg2 = YP.getValue(Dict); + arg3 = YP.getValue(Tokens); + repeat = true; + } + } + goto cutIf1; + } + if (YP.greaterThanOrEqual(C1, new ListPair(97, Atom.NIL))) + { + if (YP.lessThanOrEqual(C1, new ListPair(122, Atom.NIL))) + { + foreach (bool l4 in read_identifier(C1, Dict, Tokens)) + { + yield return false; + } + goto cutIf2; + } + } + if (YP.greaterThanOrEqual(C1, new ListPair(65, Atom.NIL))) + { + if (YP.lessThanOrEqual(C1, new ListPair(90, Atom.NIL))) + { + foreach (bool l4 in read_variable(C1, Dict, Tokens)) + { + yield return false; + } + goto cutIf3; + } + } + if (YP.greaterThanOrEqual(C1, new ListPair(48, Atom.NIL))) + { + if (YP.lessThanOrEqual(C1, new ListPair(57, Atom.NIL))) + { + foreach (bool l4 in read_number(C1, Dict, Tokens)) + { + yield return false; + } + goto cutIf4; + } + } + if (YP.lessThan(C1, 127)) + { + foreach (bool l3 in read_special(C1, Dict, Tokens)) + { + yield return false; + } + goto cutIf5; + } + if (YP.lessThanOrEqual(C1, 160)) + { + foreach (bool l3 in YP.get_code(C2)) + { +#if false + foreach (bool l4 in read_tokens(C2, Dict, Tokens)) + { + yield return false; + } +#endif + arg1 = YP.getValue(C2); + arg2 = YP.getValue(Dict); + arg3 = YP.getValue(Tokens); + repeat = true; + } + goto cutIf6; + } + if (YP.greaterThanOrEqual(C1, 223)) + { + if (YP.notEqual(C1, 247)) + { + foreach (bool l4 in read_identifier(C1, Dict, Tokens)) + { + yield return false; + } + goto cutIf7; + } + } + if (YP.greaterThanOrEqual(C1, 192)) + { + if (YP.notEqual(C1, 215)) + { + foreach (bool l4 in read_variable(C1, Dict, Tokens)) + { + yield return false; + } + goto cutIf8; + } + } + if (YP.notEqual(C1, 170)) + { + if (YP.notEqual(C1, 186)) + { + foreach (bool l4 in read_symbol(C1, Dict, Tokens)) + { + yield return false; + } + goto cutIf9; + } + } + foreach (bool l2 in read_identifier(C1, Dict, Tokens)) + { + yield return false; + } + cutIf9: + cutIf8: + cutIf7: + cutIf6: + cutIf5: + cutIf4: + cutIf3: + cutIf2: + cutIf1: + { } + } + } + } + + // Compiler output follows. + + class YPInnerClass { } + static Type getDeclaringClass() { return typeof(YPInnerClass).DeclaringType; } + + public static IEnumerable parseInput(object TermList) + { + { + Variable TermAndVariables = new Variable(); + FindallAnswers findallAnswers1 = new FindallAnswers(TermAndVariables); + foreach (bool l2 in parseInputHelper(TermAndVariables)) + { + findallAnswers1.add(); + } + foreach (bool l2 in findallAnswers1.result(TermList)) + { + yield return false; + } + } + } + + public static IEnumerable parseInputHelper(object arg1) + { + { + Variable Term = new Variable(); + Variable Variables = new Variable(); + Variable Answer = new Variable(); + Variable x4 = new Variable(); + foreach (bool l2 in YP.unify(arg1, new Functor2(@"f", Term, Variables))) + { + foreach (bool l3 in YP.repeat()) + { + foreach (bool l4 in portable_read3(Answer, Variables, x4)) + { + foreach (bool l5 in remove_pos(Answer, Term)) + { + if (YP.termEqual(Term, Atom.a(@"end_of_file"))) + { + yield break; + goto cutIf1; + } + yield return false; + cutIf1: + { } + } + } + } + } + } + } + + public static IEnumerable clear_errors() + { + { + yield return false; + } + } + + public static IEnumerable remove_pos(object arg1, object arg2) + { + { + Variable X = new Variable(); + foreach (bool l2 in YP.unify(arg1, X)) + { + foreach (bool l3 in YP.unify(arg2, X)) + { + if (YP.var(X)) + { + yield return true; + yield break; + } + } + } + } + { + object X = arg2; + Variable _Pos = new Variable(); + Variable _Name = new Variable(); + foreach (bool l2 in YP.unify(arg1, new Functor3(@"$VAR", _Pos, _Name, X))) + { + if (YP.var(X)) + { + yield return true; + yield break; + } + } + } + { + foreach (bool l2 in YP.unify(arg1, Atom.NIL)) + { + foreach (bool l3 in YP.unify(arg2, Atom.NIL)) + { + yield return true; + yield break; + } + } + } + { + Variable H = new Variable(); + Variable T = new Variable(); + Variable NH = new Variable(); + Variable NT = new Variable(); + foreach (bool l2 in YP.unify(arg1, new ListPair(H, T))) + { + foreach (bool l3 in YP.unify(arg2, new ListPair(NH, NT))) + { + foreach (bool l4 in remove_pos(H, NH)) + { + foreach (bool l5 in remove_pos(T, NT)) + { + yield return false; + } + } + yield break; + } + } + } + { + Variable A = new Variable(); + Variable B = new Variable(); + Variable NA = new Variable(); + Variable NB = new Variable(); + foreach (bool l2 in YP.unify(arg1, new Functor2(@",", A, B))) + { + foreach (bool l3 in YP.unify(arg2, new Functor2(@",", NA, NB))) + { + foreach (bool l4 in remove_pos(A, NA)) + { + foreach (bool l5 in remove_pos(B, NB)) + { + yield return false; + } + } + yield break; + } + } + } + { + Variable Atom_1 = new Variable(); + Variable _F = new Variable(); + foreach (bool l2 in YP.unify(arg1, Atom_1)) + { + foreach (bool l3 in YP.unify(arg2, Atom_1)) + { + foreach (bool l4 in YP.functor(Atom_1, _F, 0)) + { + yield return false; + } + } + } + } + { + object Term = arg1; + object NewTerm = arg2; + Variable Func = new Variable(); + Variable _Pos = new Variable(); + Variable Args = new Variable(); + Variable NArgs = new Variable(); + if (YP.nonvar(Term)) + { + foreach (bool l3 in YP.univ(Term, new ListPair(Func, new ListPair(_Pos, Args)))) + { + foreach (bool l4 in remove_pos(Args, NArgs)) + { + foreach (bool l5 in YP.univ(NewTerm, new ListPair(Func, NArgs))) + { + yield return false; + } + } + } + } + } + } + + public static IEnumerable portable_read_position(object Term, object PosTerm, object Syntax) + { + { + foreach (bool l2 in portable_read(PosTerm, Syntax)) + { + foreach (bool l3 in remove_pos(PosTerm, Term)) + { + yield return false; + } + } + } + } + + public static IEnumerable portable_read(object Answer, object Syntax) + { + { + Variable Tokens = new Variable(); + Variable ParseTokens = new Variable(); + foreach (bool l2 in read_tokens1(Tokens)) + { + foreach (bool l3 in remove_comments(Tokens, ParseTokens, Syntax)) + { + foreach (bool l4 in parse2(ParseTokens, Answer)) + { + yield return false; + } + } + } + } + } + + public static IEnumerable portable_read3(object Answer, object Variables, object Syntax) + { + { + Variable Tokens = new Variable(); + Variable ParseTokens = new Variable(); + foreach (bool l2 in read_tokens2(Tokens, Variables)) + { + foreach (bool l3 in remove_comments(Tokens, ParseTokens, Syntax)) + { + foreach (bool l4 in parse2(ParseTokens, Answer)) + { + yield return false; + } + } + } + } + } + + public static IEnumerable remove_comments(object arg1, object arg2, object arg3) + { + { + foreach (bool l2 in YP.unify(arg1, Atom.NIL)) + { + foreach (bool l3 in YP.unify(arg2, Atom.NIL)) + { + foreach (bool l4 in YP.unify(arg3, Atom.NIL)) + { + yield return false; + } + } + } + } + { + object Ys = arg2; + Variable S = new Variable(); + Variable E = new Variable(); + Variable Xs = new Variable(); + Variable Zs = new Variable(); + foreach (bool l2 in YP.unify(arg1, new ListPair(new Functor2(@"comment", S, E), Xs))) + { + foreach (bool l3 in YP.unify(arg3, new ListPair(new Functor2(@"comment", S, E), Zs))) + { + foreach (bool l4 in remove_comments(Xs, Ys, Zs)) + { + yield return false; + } + yield break; + } + } + } + { + Variable Pos = new Variable(); + Variable Xs = new Variable(); + Variable Ys = new Variable(); + Variable Pos2 = new Variable(); + Variable Zs = new Variable(); + foreach (bool l2 in YP.unify(arg1, new ListPair(new Functor2(@"/", Atom.a(@"["), Pos), Xs))) + { + foreach (bool l3 in YP.unify(arg2, new ListPair(Atom.a(@"["), Ys))) + { + foreach (bool l4 in YP.unify(arg3, new ListPair(new Functor2(@"list", Pos, Pos2), Zs))) + { + foreach (bool l5 in YP.unify(Pos2, YP.add(Pos, 1))) + { + foreach (bool l6 in remove_comments(Xs, Ys, Zs)) + { + yield return false; + } + } + yield break; + } + } + } + } + { + Variable Pos = new Variable(); + Variable Xs = new Variable(); + Variable Ys = new Variable(); + Variable Pos2 = new Variable(); + Variable Zs = new Variable(); + foreach (bool l2 in YP.unify(arg1, new ListPair(new Functor2(@"/", Atom.a(@"]"), Pos), Xs))) + { + foreach (bool l3 in YP.unify(arg2, new ListPair(Atom.a(@"]"), Ys))) + { + foreach (bool l4 in YP.unify(arg3, new ListPair(new Functor2(@"list", Pos, Pos2), Zs))) + { + foreach (bool l5 in YP.unify(Pos2, YP.add(Pos, 1))) + { + foreach (bool l6 in remove_comments(Xs, Ys, Zs)) + { + yield return false; + } + } + yield break; + } + } + } + } + { + object Zs = arg3; + Variable Token = new Variable(); + Variable Xs = new Variable(); + Variable Ys = new Variable(); + foreach (bool l2 in YP.unify(arg1, new ListPair(Token, Xs))) + { + foreach (bool l3 in YP.unify(arg2, new ListPair(Token, Ys))) + { + foreach (bool l4 in remove_comments(Xs, Ys, Zs)) + { + yield return false; + } + } + } + } + } + + public static IEnumerable expect(object Token, object arg2, object arg3) + { + { + object Rest = arg3; + foreach (bool l2 in YP.unify(arg2, new ListPair(Token, Rest))) + { + yield return true; + yield break; + } + } + { + object S0 = arg2; + object x3 = arg3; + foreach (bool l2 in syntax_error(new ListPair(Token, new ListPair(Atom.a(@"or"), new ListPair(Atom.a(@"operator"), new ListPair(Atom.a(@"expected"), Atom.NIL)))), S0)) + { + yield return false; + } + } + } + + public static IEnumerable parse2(object Tokens, object Answer) + { + { + Variable Term = new Variable(); + Variable LeftOver = new Variable(); + foreach (bool l2 in clear_errors()) + { + foreach (bool l3 in parse(Tokens, 1200, Term, LeftOver)) + { + foreach (bool l4 in all_read(LeftOver)) + { + foreach (bool l5 in YP.unify(Answer, Term)) + { + yield return false; + } + yield break; + } + } + foreach (bool l3 in syntax_error(Tokens)) + { + yield return false; + } + } + } + } + + public static IEnumerable all_read(object arg1) + { + { + foreach (bool l2 in YP.unify(arg1, Atom.NIL)) + { + yield return false; + } + } + { + Variable Token = new Variable(); + Variable S = new Variable(); + foreach (bool l2 in YP.unify(arg1, new ListPair(Token, S))) + { + foreach (bool l3 in syntax_error(new ListPair(Atom.a(@"operator"), new ListPair(Atom.a(@"expected"), new ListPair(Atom.a(@"after"), new ListPair(Atom.a(@"expression"), Atom.NIL)))), new ListPair(Token, S))) + { + yield return false; + } + } + } + } + + public static IEnumerable parse(object arg1, object arg2, object arg3, object arg4) + { + { + object x1 = arg2; + object x2 = arg3; + object x3 = arg4; + foreach (bool l2 in YP.unify(arg1, Atom.NIL)) + { + foreach (bool l3 in syntax_error(new ListPair(Atom.a(@"expression"), new ListPair(Atom.a(@"expected"), Atom.NIL)), Atom.NIL)) + { + yield return false; + } + } + } + { + object Precedence = arg2; + object Term = arg3; + object LeftOver = arg4; + Variable Token = new Variable(); + Variable RestTokens = new Variable(); + foreach (bool l2 in YP.unify(arg1, new ListPair(Token, RestTokens))) + { + foreach (bool l3 in parse5(Token, RestTokens, Precedence, Term, LeftOver)) + { + yield return false; + } + } + } + } + + public static IEnumerable parse5(object arg1, object arg2, object arg3, object arg4, object arg5) + { + { + object S0 = arg2; + object x2 = arg3; + object x3 = arg4; + object x4 = arg5; + foreach (bool l2 in YP.unify(arg1, Atom.a(@"}"))) + { + foreach (bool l3 in cannot_start(Atom.a(@"}"), S0)) + { + yield return false; + } + } + } + { + object S0 = arg2; + object x2 = arg3; + object x3 = arg4; + object x4 = arg5; + foreach (bool l2 in YP.unify(arg1, Atom.a(@"]"))) + { + foreach (bool l3 in cannot_start(Atom.a(@"]"), S0)) + { + yield return false; + } + } + } + { + object S0 = arg2; + object x2 = arg3; + object x3 = arg4; + object x4 = arg5; + foreach (bool l2 in YP.unify(arg1, Atom.a(@")"))) + { + foreach (bool l3 in cannot_start(Atom.a(@")"), S0)) + { + yield return false; + } + } + } + { + object S0 = arg2; + object x2 = arg3; + object x3 = arg4; + object x4 = arg5; + foreach (bool l2 in YP.unify(arg1, Atom.a(@","))) + { + foreach (bool l3 in cannot_start(Atom.a(@","), S0)) + { + yield return false; + } + } + } + { + object S0 = arg2; + object x2 = arg3; + object x3 = arg4; + object x4 = arg5; + foreach (bool l2 in YP.unify(arg1, Atom.a(@"|"))) + { + foreach (bool l3 in cannot_start(Atom.a(@"|"), S0)) + { + yield return false; + } + } + } + { + object S0 = arg2; + object Precedence = arg3; + object Answer = arg4; + object S = arg5; + Variable Chars = new Variable(); + foreach (bool l2 in YP.unify(arg1, new Functor1(@"string", Chars))) + { + foreach (bool l3 in exprtl0(S0, Chars, Precedence, Answer, S)) + { + yield return false; + } + } + } + { + object S0 = arg2; + object Precedence = arg3; + object Answer = arg4; + object S = arg5; + Variable Number = new Variable(); + foreach (bool l2 in YP.unify(arg1, new Functor1(@"number", Number))) + { + foreach (bool l3 in exprtl0(S0, Number, Precedence, Answer, S)) + { + yield return false; + } + } + } + { + object Precedence = arg3; + object Answer = arg4; + object S = arg5; + Variable S1 = new Variable(); + foreach (bool l2 in YP.unify(arg1, Atom.a(@"["))) + { + foreach (bool l3 in YP.unify(arg2, new ListPair(Atom.a(@"]"), S1))) + { + foreach (bool l4 in read_atom(new Functor2(@"/", Atom.NIL, 0), S1, Precedence, Answer, S)) + { + yield return false; + } + yield break; + } + } + } + { + object S1 = arg2; + object Precedence = arg3; + object Answer = arg4; + object S = arg5; + Variable Arg1 = new Variable(); + Variable S2 = new Variable(); + Variable RestArgs = new Variable(); + Variable S3 = new Variable(); + foreach (bool l2 in YP.unify(arg1, Atom.a(@"["))) + { + foreach (bool l3 in parse(S1, 999, Arg1, S2)) + { + foreach (bool l4 in read_list(S2, RestArgs, S3)) + { + foreach (bool l5 in exprtl0(S3, new ListPair(Arg1, RestArgs), Precedence, Answer, S)) + { + yield return false; + } + yield break; + } + } + } + } + { + object S1 = arg2; + object Precedence = arg3; + object Answer = arg4; + object S = arg5; + Variable Term = new Variable(); + Variable S2 = new Variable(); + Variable S3 = new Variable(); + foreach (bool l2 in YP.unify(arg1, Atom.a(@"("))) + { + foreach (bool l3 in parse(S1, 1200, Term, S2)) + { + foreach (bool l4 in expect(Atom.a(@")"), S2, S3)) + { + foreach (bool l5 in exprtl0(S3, Term, Precedence, Answer, S)) + { + yield return false; + } + yield break; + } + } + } + } + { + object S1 = arg2; + object Precedence = arg3; + object Answer = arg4; + object S = arg5; + Variable Term = new Variable(); + Variable S2 = new Variable(); + Variable S3 = new Variable(); + foreach (bool l2 in YP.unify(arg1, Atom.a(@" ("))) + { + foreach (bool l3 in parse(S1, 1200, Term, S2)) + { + foreach (bool l4 in expect(Atom.a(@")"), S2, S3)) + { + foreach (bool l5 in exprtl0(S3, Term, Precedence, Answer, S)) + { + yield return false; + } + yield break; + } + } + } + } + { + object Precedence = arg3; + object Answer = arg4; + object S = arg5; + Variable _Pos = new Variable(); + Variable S1 = new Variable(); + foreach (bool l2 in YP.unify(arg1, new Functor2(@"/", Atom.a(@"{"), _Pos))) + { + foreach (bool l3 in YP.unify(arg2, new ListPair(Atom.a(@"}"), S1))) + { + foreach (bool l4 in read_atom(Atom.a(@"{}"), S1, Precedence, Answer, S)) + { + yield return false; + } + yield break; + } + } + } + { + object S1 = arg2; + object Precedence = arg3; + object Answer = arg4; + object S = arg5; + Variable Pos = new Variable(); + Variable Term = new Variable(); + Variable S2 = new Variable(); + Variable S3 = new Variable(); + foreach (bool l2 in YP.unify(arg1, new Functor2(@"/", Atom.a(@"{"), Pos))) + { + foreach (bool l3 in parse(S1, 1200, Term, S2)) + { + foreach (bool l4 in expect(Atom.a(@"}"), S2, S3)) + { + foreach (bool l5 in exprtl0(S3, new Functor2(@"{}", Pos, Term), Precedence, Answer, S)) + { + yield return false; + } + yield break; + } + } + } + } + { + object Precedence = arg3; + object Answer = arg4; + object S = arg5; + Variable Variable_1 = new Variable(); + Variable Name = new Variable(); + Variable Pos = new Variable(); + Variable S1 = new Variable(); + Variable Arg1 = new Variable(); + Variable S2 = new Variable(); + Variable RestArgs = new Variable(); + Variable S3 = new Variable(); + Variable Term = new Variable(); + foreach (bool l2 in YP.unify(arg1, new Functor3(@"var", Variable_1, Name, Pos))) + { + foreach (bool l3 in YP.unify(arg2, new ListPair(Atom.a(@"("), S1))) + { + foreach (bool l4 in parse(S1, 999, Arg1, S2)) + { + foreach (bool l5 in read_args(S2, RestArgs, S3)) + { + foreach (bool l6 in YP.univ(Term, new ListPair(Atom.a(@"call"), new ListPair(new Functor3(@"$VAR", Pos, Name, Variable_1), new ListPair(Arg1, RestArgs))))) + { + foreach (bool l7 in exprtl0(S3, Term, Precedence, Answer, S)) + { + yield return false; + } + } + yield break; + } + } + yield break; + } + } + } + { + object S0 = arg2; + object Precedence = arg3; + object Answer = arg4; + object S = arg5; + Variable Variable_1 = new Variable(); + Variable Name = new Variable(); + Variable Pos = new Variable(); + foreach (bool l2 in YP.unify(arg1, new Functor3(@"var", Variable_1, Name, Pos))) + { + foreach (bool l3 in exprtl0(S0, new Functor3(@"$VAR", Pos, Name, Variable_1), Precedence, Answer, S)) + { + yield return false; + } + } + } + { + object S0 = arg2; + object Precedence = arg3; + object Answer = arg4; + object S = arg5; + Variable Atom_1 = new Variable(); + Variable P = new Variable(); + foreach (bool l2 in YP.unify(arg1, new Functor2(@"atom", Atom_1, P))) + { + foreach (bool l3 in read_atom(new Functor2(@"/", Atom_1, P), S0, Precedence, Answer, S)) + { + yield return false; + } + } + } + } + + public static IEnumerable read_atom(object arg1, object arg2, object Precedence, object Answer, object S) + { + { + Variable _Pos = new Variable(); + Variable Number = new Variable(); + Variable S1 = new Variable(); + Variable Negative = new Variable(); + foreach (bool l2 in YP.unify(arg1, new Functor2(@"/", Atom.a(@"-"), _Pos))) + { + foreach (bool l3 in YP.unify(arg2, new ListPair(new Functor1(@"number", Number), S1))) + { + foreach (bool l4 in YP.unify(Negative, YP.negate(Number))) + { + foreach (bool l5 in exprtl0(S1, Negative, Precedence, Answer, S)) + { + yield return false; + } + } + yield break; + } + } + } + { + Variable Functor_1 = new Variable(); + Variable Pos = new Variable(); + Variable S1 = new Variable(); + Variable Arg1 = new Variable(); + Variable S2 = new Variable(); + Variable RestArgs = new Variable(); + Variable S3 = new Variable(); + Variable Term = new Variable(); + foreach (bool l2 in YP.unify(arg1, new Functor2(@"/", Functor_1, Pos))) + { + foreach (bool l3 in YP.unify(arg2, new ListPair(Atom.a(@"("), S1))) + { + foreach (bool l4 in parse(S1, 999, Arg1, S2)) + { + foreach (bool l5 in read_args(S2, RestArgs, S3)) + { + foreach (bool l6 in YP.univ(Term, new ListPair(Functor_1, new ListPair(Pos, new ListPair(Arg1, RestArgs))))) + { + foreach (bool l7 in exprtl0(S3, Term, Precedence, Answer, S)) + { + yield return false; + } + } + yield break; + } + } + yield break; + } + } + } + { + object S0 = arg2; + Variable Op = new Variable(); + Variable Pos = new Variable(); + Variable Oprec = new Variable(); + Variable Aprec = new Variable(); + Variable Flag = new Variable(); + Variable Term = new Variable(); + Variable Arg = new Variable(); + Variable S1 = new Variable(); + foreach (bool l2 in YP.unify(arg1, new Functor2(@"/", Op, Pos))) + { + foreach (bool l3 in prefixop(Op, Oprec, Aprec)) + { + foreach (bool l4 in possible_right_operand(S0, Flag)) + { + if (YP.lessThan(Flag, 0)) + { + foreach (bool l6 in YP.univ(Term, new ListPair(Op, new ListPair(Pos, Atom.NIL)))) + { + foreach (bool l7 in exprtl0(S0, Term, Precedence, Answer, S)) + { + yield return false; + } + } + goto cutIf1; + } + if (YP.greaterThan(Oprec, Precedence)) + { + foreach (bool l6 in syntax_error(new ListPair(Atom.a(@"prefix"), new ListPair(Atom.a(@"operator"), new ListPair(Op, new ListPair(Atom.a(@"in"), new ListPair(Atom.a(@"context"), new ListPair(Atom.a(@"with"), new ListPair(Atom.a(@"precedence"), new ListPair(Precedence, Atom.NIL)))))))), S0)) + { + yield return false; + } + goto cutIf2; + } + if (YP.greaterThan(Flag, 0)) + { + foreach (bool l6 in parse(S0, Aprec, Arg, S1)) + { + foreach (bool l7 in YP.univ(Term, new ListPair(Op, new ListPair(Pos, new ListPair(Arg, Atom.NIL))))) + { + foreach (bool l8 in exprtl(S1, Oprec, Term, Precedence, Answer, S)) + { + yield return false; + } + } + yield break; + } + goto cutIf3; + } + foreach (bool l5 in peepop(S0, S1)) + { + foreach (bool l6 in prefix_is_atom(S1, Oprec)) + { + foreach (bool l7 in exprtl(S1, Oprec, new Functor2(@"/", Op, Pos), Precedence, Answer, S)) + { + yield return false; + } + } + } + foreach (bool l5 in parse(S0, Aprec, Arg, S1)) + { + foreach (bool l6 in YP.univ(Term, new ListPair(Op, new ListPair(Pos, new ListPair(Arg, Atom.NIL))))) + { + foreach (bool l7 in exprtl(S1, Oprec, Term, Precedence, Answer, S)) + { + yield return false; + } + } + yield break; + } + cutIf3: + cutIf2: + cutIf1: + { } + } + yield break; + } + } + } + { + object S0 = arg2; + Variable Atom_1 = new Variable(); + Variable Pos = new Variable(); + Variable Term = new Variable(); + foreach (bool l2 in YP.unify(arg1, new Functor2(@"/", Atom_1, Pos))) + { + foreach (bool l3 in YP.univ(Term, new ListPair(Atom_1, new ListPair(Pos, Atom.NIL)))) + { + foreach (bool l4 in exprtl0(S0, Term, Precedence, Answer, S)) + { + yield return false; + } + } + } + } + } + + public static IEnumerable cannot_start(object Token, object S0) + { + { + foreach (bool l2 in syntax_error(new ListPair(Token, new ListPair(Atom.a(@"cannot"), new ListPair(Atom.a(@"start"), new ListPair(Atom.a(@"an"), new ListPair(Atom.a(@"expression"), Atom.NIL))))), S0)) + { + yield return false; + } + } + } + + public static IEnumerable read_args(object arg1, object arg2, object arg3) + { + { + object S = arg3; + Variable S1 = new Variable(); + Variable Term = new Variable(); + Variable Rest = new Variable(); + Variable S2 = new Variable(); + foreach (bool l2 in YP.unify(arg1, new ListPair(Atom.a(@","), S1))) + { + foreach (bool l3 in YP.unify(arg2, new ListPair(Term, Rest))) + { + foreach (bool l4 in parse(S1, 999, Term, S2)) + { + foreach (bool l5 in read_args(S2, Rest, S)) + { + yield return false; + } + yield break; + } + yield break; + } + } + } + { + object S = arg3; + foreach (bool l2 in YP.unify(arg1, new ListPair(Atom.a(@")"), S))) + { + foreach (bool l3 in YP.unify(arg2, Atom.NIL)) + { + yield return true; + yield break; + } + } + } + { + object S = arg1; + object x2 = arg2; + object x3 = arg3; + foreach (bool l2 in syntax_error(new ListPair(Atom.a(@", or )"), new ListPair(Atom.a(@"expected"), new ListPair(Atom.a(@"in"), new ListPair(Atom.a(@"arguments"), Atom.NIL)))), S)) + { + yield return false; + } + } + } + + public static IEnumerable read_list(object arg1, object arg2, object arg3) + { + { + object x1 = arg2; + object x2 = arg3; + foreach (bool l2 in YP.unify(arg1, Atom.NIL)) + { + foreach (bool l3 in syntax_error(new ListPair(Atom.a(@", | or ]"), new ListPair(Atom.a(@"expected"), new ListPair(Atom.a(@"in"), new ListPair(Atom.a(@"list"), Atom.NIL)))), Atom.NIL)) + { + yield return false; + } + } + } + { + object Rest = arg2; + object S = arg3; + Variable Token = new Variable(); + Variable S1 = new Variable(); + foreach (bool l2 in YP.unify(arg1, new ListPair(Token, S1))) + { + foreach (bool l3 in read_list4(Token, S1, Rest, S)) + { + yield return false; + } + } + } + } + + public static IEnumerable read_list4(object arg1, object arg2, object arg3, object arg4) + { + { + object S1 = arg2; + object S = arg4; + Variable Term = new Variable(); + Variable Rest = new Variable(); + Variable S2 = new Variable(); + foreach (bool l2 in YP.unify(arg1, Atom.a(@","))) + { + foreach (bool l3 in YP.unify(arg3, new ListPair(Term, Rest))) + { + foreach (bool l4 in parse(S1, 999, Term, S2)) + { + foreach (bool l5 in read_list(S2, Rest, S)) + { + yield return false; + } + yield break; + } + yield break; + } + } + } + { + object S1 = arg2; + object Rest = arg3; + object S = arg4; + Variable S2 = new Variable(); + foreach (bool l2 in YP.unify(arg1, Atom.a(@"|"))) + { + foreach (bool l3 in parse(S1, 999, Rest, S2)) + { + foreach (bool l4 in expect(Atom.a(@"]"), S2, S)) + { + yield return false; + } + yield break; + } + yield break; + } + } + { + Variable S1 = new Variable(); + foreach (bool l2 in YP.unify(arg1, Atom.a(@"]"))) + { + foreach (bool l3 in YP.unify(arg2, S1)) + { + foreach (bool l4 in YP.unify(arg3, Atom.NIL)) + { + foreach (bool l5 in YP.unify(arg4, S1)) + { + yield return true; + yield break; + } + } + } + } + } + { + object Token = arg1; + object S1 = arg2; + object x3 = arg3; + object x4 = arg4; + foreach (bool l2 in syntax_error(new ListPair(Atom.a(@", | or ]"), new ListPair(Atom.a(@"expected"), new ListPair(Atom.a(@"in"), new ListPair(Atom.a(@"list"), Atom.NIL)))), new ListPair(Token, S1))) + { + yield return false; + } + } + } + + public static IEnumerable possible_right_operand(object arg1, object arg2) + { + { + foreach (bool l2 in YP.unify(arg1, Atom.NIL)) + { + foreach (bool l3 in YP.unify(arg2, -1)) + { + yield return false; + } + } + } + { + object Flag = arg2; + Variable H = new Variable(); + Variable T = new Variable(); + foreach (bool l2 in YP.unify(arg1, new ListPair(H, T))) + { + foreach (bool l3 in possible_right_operand3(H, Flag, T)) + { + yield return false; + } + } + } + } + + public static IEnumerable possible_right_operand3(object arg1, object arg2, object arg3) + { + { + object x4 = arg3; + Variable x1 = new Variable(); + Variable x2 = new Variable(); + Variable x3 = new Variable(); + foreach (bool l2 in YP.unify(arg1, new Functor3(@"var", x1, x2, x3))) + { + foreach (bool l3 in YP.unify(arg2, 1)) + { + yield return false; + } + } + } + { + object x2 = arg3; + Variable x1 = new Variable(); + foreach (bool l2 in YP.unify(arg1, new Functor1(@"number", x1))) + { + foreach (bool l3 in YP.unify(arg2, 1)) + { + yield return false; + } + } + } + { + object x2 = arg3; + Variable x1 = new Variable(); + foreach (bool l2 in YP.unify(arg1, new Functor1(@"string", x1))) + { + foreach (bool l3 in YP.unify(arg2, 1)) + { + yield return false; + } + } + } + { + object x1 = arg3; + foreach (bool l2 in YP.unify(arg1, Atom.a(@" ("))) + { + foreach (bool l3 in YP.unify(arg2, 1)) + { + yield return false; + } + } + } + { + object x1 = arg3; + foreach (bool l2 in YP.unify(arg1, Atom.a(@"("))) + { + foreach (bool l3 in YP.unify(arg2, 0)) + { + yield return false; + } + } + } + { + object x1 = arg3; + foreach (bool l2 in YP.unify(arg1, Atom.a(@")"))) + { + foreach (bool l3 in YP.unify(arg2, -1)) + { + yield return false; + } + } + } + { + Variable x1 = new Variable(); + foreach (bool l2 in YP.unify(arg1, Atom.a(@"["))) + { + foreach (bool l3 in YP.unify(arg2, 0)) + { + foreach (bool l4 in YP.unify(arg3, new ListPair(Atom.a(@"]"), x1))) + { + yield return true; + yield break; + } + } + } + } + { + object x1 = arg3; + foreach (bool l2 in YP.unify(arg1, Atom.a(@"["))) + { + foreach (bool l3 in YP.unify(arg2, 1)) + { + yield return false; + } + } + } + { + object x1 = arg3; + foreach (bool l2 in YP.unify(arg1, Atom.a(@"]"))) + { + foreach (bool l3 in YP.unify(arg2, -1)) + { + yield return false; + } + } + } + { + Variable x1 = new Variable(); + foreach (bool l2 in YP.unify(arg1, Atom.a(@"{"))) + { + foreach (bool l3 in YP.unify(arg2, 0)) + { + foreach (bool l4 in YP.unify(arg3, new ListPair(Atom.a(@"}"), x1))) + { + yield return true; + yield break; + } + } + } + } + { + object x1 = arg3; + foreach (bool l2 in YP.unify(arg1, Atom.a(@"{"))) + { + foreach (bool l3 in YP.unify(arg2, 1)) + { + yield return false; + } + } + } + { + object x1 = arg3; + foreach (bool l2 in YP.unify(arg1, Atom.a(@"}"))) + { + foreach (bool l3 in YP.unify(arg2, -1)) + { + yield return false; + } + } + } + { + object x1 = arg3; + foreach (bool l2 in YP.unify(arg1, Atom.a(@","))) + { + foreach (bool l3 in YP.unify(arg2, -1)) + { + yield return false; + } + } + } + { + object x1 = arg3; + foreach (bool l2 in YP.unify(arg1, Atom.a(@"|"))) + { + foreach (bool l3 in YP.unify(arg2, -1)) + { + yield return false; + } + } + } + { + object x3 = arg3; + Variable x1 = new Variable(); + Variable x2 = new Variable(); + foreach (bool l2 in YP.unify(arg1, new Functor2(@"atom", x1, x2))) + { + foreach (bool l3 in YP.unify(arg2, 0)) + { + yield return false; + } + } + } + } + + public static IEnumerable peepop(object arg1, object arg2) + { + { + Variable F = new Variable(); + Variable Pos = new Variable(); + Variable S1 = new Variable(); + foreach (bool l2 in YP.unify(arg1, new ListPair(new Functor2(@"atom", F, Pos), new ListPair(Atom.a(@"("), S1)))) + { + foreach (bool l3 in YP.unify(arg2, new ListPair(new Functor2(@"atom", F, Pos), new ListPair(Atom.a(@"("), S1)))) + { + yield return true; + yield break; + } + } + } + { + Variable F = new Variable(); + Variable Pos = new Variable(); + Variable S1 = new Variable(); + Variable L = new Variable(); + Variable P = new Variable(); + Variable R = new Variable(); + foreach (bool l2 in YP.unify(arg1, new ListPair(new Functor2(@"atom", F, Pos), S1))) + { + foreach (bool l3 in YP.unify(arg2, new ListPair(new Functor(Atom.a(@"infixop", Atom.a(@"")), new object[] { new Functor2(@"/", F, Pos), L, P, R }), S1))) + { + foreach (bool l4 in infixop(F, L, P, R)) + { + yield return false; + } + } + } + } + { + Variable F = new Variable(); + Variable Pos = new Variable(); + Variable S1 = new Variable(); + Variable L = new Variable(); + Variable P = new Variable(); + foreach (bool l2 in YP.unify(arg1, new ListPair(new Functor2(@"atom", F, Pos), S1))) + { + foreach (bool l3 in YP.unify(arg2, new ListPair(new Functor3(Atom.a(@"postfixop", Atom.a(@"")), new Functor2(@"/", F, Pos), L, P), S1))) + { + foreach (bool l4 in postfixop(F, L, P)) + { + yield return false; + } + } + } + } + { + Variable S0 = new Variable(); + foreach (bool l2 in YP.unify(arg1, S0)) + { + foreach (bool l3 in YP.unify(arg2, S0)) + { + yield return false; + } + } + } + } + + public static IEnumerable prefix_is_atom(object arg1, object arg2) + { + { + object Precedence = arg2; + Variable Token = new Variable(); + Variable x2 = new Variable(); + foreach (bool l2 in YP.unify(arg1, new ListPair(Token, x2))) + { + foreach (bool l3 in prefix_is_atom(Token, Precedence)) + { + yield return false; + } + } + } + { + object P = arg2; + Variable x1 = new Variable(); + Variable L = new Variable(); + Variable x3 = new Variable(); + Variable x4 = new Variable(); + foreach (bool l2 in YP.unify(arg1, new Functor(Atom.a(@"infixop", Atom.a(@"")), new object[] { x1, L, x3, x4 }))) + { + if (YP.greaterThanOrEqual(L, P)) + { + yield return false; + } + } + } + { + object P = arg2; + Variable x1 = new Variable(); + Variable L = new Variable(); + Variable x3 = new Variable(); + foreach (bool l2 in YP.unify(arg1, new Functor3(Atom.a(@"postfixop", Atom.a(@"")), x1, L, x3))) + { + if (YP.greaterThanOrEqual(L, P)) + { + yield return false; + } + } + } + { + object x1 = arg2; + foreach (bool l2 in YP.unify(arg1, Atom.a(@")"))) + { + yield return false; + } + } + { + object x1 = arg2; + foreach (bool l2 in YP.unify(arg1, Atom.a(@"]"))) + { + yield return false; + } + } + { + object x1 = arg2; + foreach (bool l2 in YP.unify(arg1, Atom.a(@"}"))) + { + yield return false; + } + } + { + object P = arg2; + foreach (bool l2 in YP.unify(arg1, Atom.a(@"|"))) + { + if (YP.greaterThanOrEqual(1100, P)) + { + yield return false; + } + } + } + { + object P = arg2; + foreach (bool l2 in YP.unify(arg1, Atom.a(@","))) + { + if (YP.greaterThanOrEqual(1000, P)) + { + yield return false; + } + } + } + { + object x1 = arg2; + foreach (bool l2 in YP.unify(arg1, Atom.NIL)) + { + yield return false; + } + } + } + + public static IEnumerable exprtl0(object arg1, object arg2, object arg3, object arg4, object arg5) + { + { + object x2 = arg3; + Variable Term = new Variable(); + foreach (bool l2 in YP.unify(arg1, Atom.NIL)) + { + foreach (bool l3 in YP.unify(arg2, Term)) + { + foreach (bool l4 in YP.unify(arg4, Term)) + { + foreach (bool l5 in YP.unify(arg5, Atom.NIL)) + { + yield return false; + } + } + } + } + } + { + object Term = arg2; + object Precedence = arg3; + object Answer = arg4; + object S = arg5; + Variable Token = new Variable(); + Variable S1 = new Variable(); + foreach (bool l2 in YP.unify(arg1, new ListPair(Token, S1))) + { + foreach (bool l3 in exprtl0_6(Token, Term, Precedence, Answer, S, S1)) + { + yield return false; + } + } + } + } + + public static IEnumerable exprtl0_6(object arg1, object arg2, object arg3, object arg4, object arg5, object arg6) + { + { + object x2 = arg3; + object S1 = arg6; + Variable Term = new Variable(); + foreach (bool l2 in YP.unify(arg1, Atom.a(@"}"))) + { + foreach (bool l3 in YP.unify(arg2, Term)) + { + foreach (bool l4 in YP.unify(arg4, Term)) + { + foreach (bool l5 in YP.unify(arg5, new ListPair(Atom.a(@"}"), S1))) + { + yield return false; + } + } + } + } + } + { + object x2 = arg3; + object S1 = arg6; + Variable Term = new Variable(); + foreach (bool l2 in YP.unify(arg1, Atom.a(@"]"))) + { + foreach (bool l3 in YP.unify(arg2, Term)) + { + foreach (bool l4 in YP.unify(arg4, Term)) + { + foreach (bool l5 in YP.unify(arg5, new ListPair(Atom.a(@"]"), S1))) + { + yield return false; + } + } + } + } + } + { + object x2 = arg3; + object S1 = arg6; + Variable Term = new Variable(); + foreach (bool l2 in YP.unify(arg1, Atom.a(@")"))) + { + foreach (bool l3 in YP.unify(arg2, Term)) + { + foreach (bool l4 in YP.unify(arg4, Term)) + { + foreach (bool l5 in YP.unify(arg5, new ListPair(Atom.a(@")"), S1))) + { + yield return false; + } + } + } + } + } + { + object Term = arg2; + object Precedence = arg3; + object Answer = arg4; + object S = arg5; + object S1 = arg6; + Variable Next = new Variable(); + Variable S2 = new Variable(); + foreach (bool l2 in YP.unify(arg1, Atom.a(@","))) + { + if (YP.greaterThanOrEqual(Precedence, 1000)) + { + foreach (bool l4 in parse(S1, 1000, Next, S2)) + { + foreach (bool l5 in exprtl(S2, 1000, new Functor2(@",", Term, Next), Precedence, Answer, S)) + { + yield return false; + } + yield break; + } + goto cutIf1; + } + foreach (bool l3 in YP.unify(Answer, Term)) + { + foreach (bool l4 in YP.unify(S, new ListPair(Atom.a(@","), S1))) + { + yield return false; + } + } + cutIf1: + { } + } + } + { + object Term = arg2; + object Precedence = arg3; + object Answer = arg4; + object S = arg5; + object S1 = arg6; + Variable Next = new Variable(); + Variable S2 = new Variable(); + foreach (bool l2 in YP.unify(arg1, Atom.a(@"|"))) + { + if (YP.greaterThanOrEqual(Precedence, 1100)) + { + foreach (bool l4 in parse(S1, 1100, Next, S2)) + { + foreach (bool l5 in exprtl(S2, 1100, new Functor2(@";", Term, Next), Precedence, Answer, S)) + { + yield return false; + } + yield break; + } + goto cutIf2; + } + foreach (bool l3 in YP.unify(Answer, Term)) + { + foreach (bool l4 in YP.unify(S, new ListPair(Atom.a(@"|"), S1))) + { + yield return false; + } + } + cutIf2: + { } + } + } + { + object x2 = arg2; + object x3 = arg3; + object x4 = arg4; + object x5 = arg5; + object S1 = arg6; + Variable S = new Variable(); + foreach (bool l2 in YP.unify(arg1, new Functor1(@"string", S))) + { + foreach (bool l3 in cannot_follow(Atom.a(@"chars"), new Functor1(@"string", S), S1)) + { + yield return false; + } + } + } + { + object x2 = arg2; + object x3 = arg3; + object x4 = arg4; + object x5 = arg5; + object S1 = arg6; + Variable N = new Variable(); + foreach (bool l2 in YP.unify(arg1, new Functor1(@"number", N))) + { + foreach (bool l3 in cannot_follow(Atom.a(@"number"), new Functor1(@"number", N), S1)) + { + yield return false; + } + } + } + { + object Term = arg2; + object Precedence = arg3; + object Answer = arg4; + object S = arg5; + Variable S1 = new Variable(); + foreach (bool l2 in YP.unify(arg1, Atom.a(@"{"))) + { + foreach (bool l3 in YP.unify(arg6, new ListPair(Atom.a(@"}"), S1))) + { + foreach (bool l4 in exprtl0_atom(Atom.a(@"{}"), Term, Precedence, Answer, S, S1)) + { + yield return false; + } + yield break; + } + } + } + { + object x1 = arg2; + object x2 = arg3; + object x3 = arg4; + object x4 = arg5; + object S1 = arg6; + foreach (bool l2 in YP.unify(arg1, Atom.a(@"{"))) + { + foreach (bool l3 in cannot_follow(Atom.a(@"brace"), Atom.a(@"{"), S1)) + { + yield return false; + } + } + } + { + object Term = arg2; + object Precedence = arg3; + object Answer = arg4; + object S = arg5; + Variable S1 = new Variable(); + foreach (bool l2 in YP.unify(arg1, Atom.a(@"["))) + { + foreach (bool l3 in YP.unify(arg6, new ListPair(Atom.a(@"]"), S1))) + { + foreach (bool l4 in exprtl0_atom(Atom.NIL, Term, Precedence, Answer, S, S1)) + { + yield return false; + } + yield break; + } + } + } + { + object x1 = arg2; + object x2 = arg3; + object x3 = arg4; + object x4 = arg5; + object S1 = arg6; + foreach (bool l2 in YP.unify(arg1, Atom.a(@"["))) + { + foreach (bool l3 in cannot_follow(Atom.a(@"bracket"), Atom.a(@"["), S1)) + { + yield return false; + } + } + } + { + object x1 = arg2; + object x2 = arg3; + object x3 = arg4; + object x4 = arg5; + object S1 = arg6; + foreach (bool l2 in YP.unify(arg1, Atom.a(@"("))) + { + foreach (bool l3 in cannot_follow(Atom.a(@"parenthesis"), Atom.a(@"("), S1)) + { + yield return false; + } + } + } + { + object x1 = arg2; + object x2 = arg3; + object x3 = arg4; + object x4 = arg5; + object S1 = arg6; + foreach (bool l2 in YP.unify(arg1, Atom.a(@" ("))) + { + foreach (bool l3 in cannot_follow(Atom.a(@"parenthesis"), Atom.a(@"("), S1)) + { + yield return false; + } + } + } + { + object x4 = arg2; + object x5 = arg3; + object x6 = arg4; + object x7 = arg5; + object S1 = arg6; + Variable A = new Variable(); + Variable B = new Variable(); + Variable P = new Variable(); + foreach (bool l2 in YP.unify(arg1, new Functor3(@"var", A, B, P))) + { + foreach (bool l3 in cannot_follow(Atom.a(@"variable"), new Functor3(@"var", A, B, P), S1)) + { + yield return false; + } + } + } + { + object Term = arg2; + object Precedence = arg3; + object Answer = arg4; + object S = arg5; + object S1 = arg6; + Variable F = new Variable(); + Variable P = new Variable(); + foreach (bool l2 in YP.unify(arg1, new Functor2(@"atom", F, P))) + { + foreach (bool l3 in exprtl0_atom(new Functor2(@"/", F, P), Term, Precedence, Answer, S, S1)) + { + yield return false; + } + } + } + } + + public static IEnumerable exprtl0_atom(object arg1, object arg2, object arg3, object arg4, object arg5, object S1) + { + { + object Term = arg2; + object Precedence = arg3; + object Answer = arg4; + object S = arg5; + Variable F = new Variable(); + Variable Pos = new Variable(); + Variable L1 = new Variable(); + Variable O1 = new Variable(); + Variable R1 = new Variable(); + Variable L2 = new Variable(); + Variable O2 = new Variable(); + foreach (bool l2 in YP.unify(arg1, new Functor2(@"/", F, Pos))) + { + foreach (bool l3 in ambigop(F, Precedence, L1, O1, R1, L2, O2)) + { + foreach (bool l4 in prefix_is_atom(S1, Precedence)) + { + foreach (bool l5 in exprtl(new ListPair(new Functor3(Atom.a(@"postfixop", Atom.a(@"")), new Functor2(@"/", F, Pos), L2, O2), S1), 0, Term, Precedence, Answer, S)) + { + yield return false; + } + yield break; + } + foreach (bool l4 in exprtl(new ListPair(new Functor(Atom.a(@"infixop", Atom.a(@"")), new object[] { new Functor2(@"/", F, Pos), L1, O1, R1 }), S1), 0, Term, Precedence, Answer, S)) + { + yield return false; + } + foreach (bool l4 in exprtl(new ListPair(new Functor3(Atom.a(@"postfixop", Atom.a(@"")), new Functor2(@"/", F, Pos), L2, O2), S1), 0, Term, Precedence, Answer, S)) + { + yield return false; + } + yield break; + } + } + } + { + object Term = arg2; + object Precedence = arg3; + object Answer = arg4; + object S = arg5; + Variable F = new Variable(); + Variable Pos = new Variable(); + Variable L1 = new Variable(); + Variable O1 = new Variable(); + Variable R1 = new Variable(); + foreach (bool l2 in YP.unify(arg1, new Functor2(@"/", F, Pos))) + { + foreach (bool l3 in infixop(F, L1, O1, R1)) + { + foreach (bool l4 in exprtl(new ListPair(new Functor(Atom.a(@"infixop", Atom.a(@"")), new object[] { new Functor2(@"/", F, Pos), L1, O1, R1 }), S1), 0, Term, Precedence, Answer, S)) + { + yield return false; + } + yield break; + } + } + } + { + object Term = arg2; + object Precedence = arg3; + object Answer = arg4; + object S = arg5; + Variable F = new Variable(); + Variable Pos = new Variable(); + Variable L2 = new Variable(); + Variable O2 = new Variable(); + foreach (bool l2 in YP.unify(arg1, new Functor2(@"/", F, Pos))) + { + foreach (bool l3 in postfixop(F, L2, O2)) + { + foreach (bool l4 in exprtl(new ListPair(new Functor3(Atom.a(@"postfixop", Atom.a(@"")), new Functor2(@"/", F, Pos), L2, O2), S1), 0, Term, Precedence, Answer, S)) + { + yield return false; + } + yield break; + } + } + } + { + object X = arg1; + object x2 = arg2; + object x3 = arg3; + object x4 = arg4; + object x5 = arg5; + Variable x7 = new Variable(); + foreach (bool l2 in syntax_error(new ListPair(new Functor2(@"-", Atom.a(@"non"), Atom.a(@"operator")), new ListPair(X, new ListPair(Atom.a(@"follows"), new ListPair(Atom.a(@"expression"), Atom.NIL)))), new ListPair(new Functor2(@"atom", X, x7), S1))) + { + yield return false; + } + yield break; + } + } + + public static IEnumerable cannot_follow(object Type, object Token, object Tokens) + { + { + foreach (bool l2 in syntax_error(new ListPair(Type, new ListPair(Atom.a(@"follows"), new ListPair(Atom.a(@"expression"), Atom.NIL))), new ListPair(Token, Tokens))) + { + yield return false; + } + } + } + + public static IEnumerable exprtl(object arg1, object arg2, object arg3, object arg4, object arg5, object arg6) + { + { + object x1 = arg2; + object x3 = arg4; + Variable Term = new Variable(); + foreach (bool l2 in YP.unify(arg1, Atom.NIL)) + { + foreach (bool l3 in YP.unify(arg3, Term)) + { + foreach (bool l4 in YP.unify(arg5, Term)) + { + foreach (bool l5 in YP.unify(arg6, Atom.NIL)) + { + yield return false; + } + } + } + } + } + { + object C = arg2; + object Term = arg3; + object Precedence = arg4; + object Answer = arg5; + object S = arg6; + Variable Token = new Variable(); + Variable Tokens = new Variable(); + foreach (bool l2 in YP.unify(arg1, new ListPair(Token, Tokens))) + { + foreach (bool l3 in exprtl_7(Token, C, Term, Precedence, Answer, S, Tokens)) + { + yield return false; + } + } + } + } + + public static IEnumerable exprtl_7(object arg1, object arg2, object arg3, object arg4, object arg5, object arg6, object arg7) + { + { + object C = arg2; + object Term = arg3; + object Precedence = arg4; + object Answer = arg5; + object S = arg6; + object S1 = arg7; + Variable F = new Variable(); + Variable Pos = new Variable(); + Variable L = new Variable(); + Variable O = new Variable(); + Variable R = new Variable(); + Variable Other = new Variable(); + Variable S2 = new Variable(); + Variable Expr = new Variable(); + foreach (bool l2 in YP.unify(arg1, new Functor(Atom.a(@"infixop", Atom.a(@"")), new object[] { new Functor2(@"/", F, Pos), L, O, R }))) + { + if (YP.greaterThanOrEqual(Precedence, O)) + { + if (YP.lessThanOrEqual(C, L)) + { + foreach (bool l5 in parse(S1, R, Other, S2)) + { + foreach (bool l6 in YP.univ(Expr, new ListPair(F, new ListPair(Pos, new ListPair(Term, new ListPair(Other, Atom.NIL)))))) + { + foreach (bool l7 in exprtl(S2, O, Expr, Precedence, Answer, S)) + { + yield return false; + } + } + } + yield break; + } + } + } + } + { + object C = arg2; + object Term = arg3; + object Precedence = arg4; + object Answer = arg5; + object S = arg6; + object S1 = arg7; + Variable F = new Variable(); + Variable Pos = new Variable(); + Variable L = new Variable(); + Variable O = new Variable(); + Variable Expr = new Variable(); + Variable S2 = new Variable(); + foreach (bool l2 in YP.unify(arg1, new Functor3(Atom.a(@"postfixop", Atom.a(@"")), new Functor2(@"/", F, Pos), L, O))) + { + if (YP.greaterThanOrEqual(Precedence, O)) + { + if (YP.lessThanOrEqual(C, L)) + { + foreach (bool l5 in YP.univ(Expr, new ListPair(F, new ListPair(Pos, new ListPair(Term, Atom.NIL))))) + { + foreach (bool l6 in peepop(S1, S2)) + { + foreach (bool l7 in exprtl(S2, O, Expr, Precedence, Answer, S)) + { + yield return false; + } + } + } + yield break; + } + } + } + } + { + object C = arg2; + object Term = arg3; + object Precedence = arg4; + object Answer = arg5; + object S = arg6; + object S1 = arg7; + Variable Next = new Variable(); + Variable S2 = new Variable(); + foreach (bool l2 in YP.unify(arg1, Atom.a(@","))) + { + if (YP.greaterThanOrEqual(Precedence, 1000)) + { + if (YP.lessThan(C, 1000)) + { + foreach (bool l5 in parse(S1, 1000, Next, S2)) + { + foreach (bool l6 in exprtl(S2, 1000, new Functor2(@",", Term, Next), Precedence, Answer, S)) + { + yield return false; + } + } + yield break; + } + } + } + } + { + object C = arg2; + object Term = arg3; + object Precedence = arg4; + object Answer = arg5; + object S = arg6; + object S1 = arg7; + Variable Next = new Variable(); + Variable S2 = new Variable(); + foreach (bool l2 in YP.unify(arg1, Atom.a(@"|"))) + { + if (YP.greaterThanOrEqual(Precedence, 1100)) + { + if (YP.lessThan(C, 1100)) + { + foreach (bool l5 in parse(S1, 1100, Next, S2)) + { + foreach (bool l6 in exprtl(S2, 1100, new Functor2(@";", Term, Next), Precedence, Answer, S)) + { + yield return false; + } + } + yield break; + } + } + } + } + { + object Token = arg1; + object x2 = arg2; + object x4 = arg4; + object Tokens = arg7; + Variable Term = new Variable(); + foreach (bool l2 in YP.unify(arg3, Term)) + { + foreach (bool l3 in YP.unify(arg5, Term)) + { + foreach (bool l4 in YP.unify(arg6, new ListPair(Token, Tokens))) + { + yield return false; + } + } + } + } + } + + public static IEnumerable syntax_error(object _Message, object _List) + { + { + yield break; + } + } + + public static IEnumerable syntax_error(object _List) + { + { + yield break; + } + } + + public static IEnumerable prefixop(object F, object O, object Q) + { + { + foreach (bool l2 in YP.current_op(O, Atom.a(@"fx"), F)) + { + foreach (bool l3 in YP.unify(Q, YP.subtract(O, 1))) + { + yield return false; + } + goto cutIf1; + } + foreach (bool l2 in YP.current_op(O, Atom.a(@"fy"), F)) + { + foreach (bool l3 in YP.unify(Q, O)) + { + yield return false; + } + goto cutIf2; + } + cutIf2: + cutIf1: + { } + } + } + + public static IEnumerable postfixop(object F, object P, object O) + { + { + foreach (bool l2 in YP.current_op(O, Atom.a(@"xf"), F)) + { + foreach (bool l3 in YP.unify(P, YP.subtract(O, 1))) + { + yield return false; + } + goto cutIf1; + } + foreach (bool l2 in YP.current_op(O, Atom.a(@"yf"), F)) + { + foreach (bool l3 in YP.unify(P, O)) + { + yield return false; + } + goto cutIf2; + } + cutIf2: + cutIf1: + { } + } + } + + public static IEnumerable infixop(object F, object P, object O, object Q) + { + { + foreach (bool l2 in YP.current_op(O, Atom.a(@"xfy"), F)) + { + foreach (bool l3 in YP.unify(P, YP.subtract(O, 1))) + { + foreach (bool l4 in YP.unify(Q, O)) + { + yield return false; + } + } + goto cutIf1; + } + foreach (bool l2 in YP.current_op(O, Atom.a(@"xfx"), F)) + { + foreach (bool l3 in YP.unify(P, YP.subtract(O, 1))) + { + foreach (bool l4 in YP.unify(Q, P)) + { + yield return false; + } + } + goto cutIf2; + } + foreach (bool l2 in YP.current_op(O, Atom.a(@"yfx"), F)) + { + foreach (bool l3 in YP.unify(Q, YP.subtract(O, 1))) + { + foreach (bool l4 in YP.unify(P, O)) + { + yield return false; + } + } + goto cutIf3; + } + cutIf3: + cutIf2: + cutIf1: + { } + } + } + + public static IEnumerable ambigop(object F, object Precedence, object L1, object O1, object R1, object L2, object O2) + { + { + foreach (bool l2 in postfixop(F, L2, O2)) + { + if (YP.lessThanOrEqual(O2, Precedence)) + { + foreach (bool l4 in infixop(F, L1, O1, R1)) + { + if (YP.lessThanOrEqual(O1, Precedence)) + { + yield return false; + } + } + } + } + } + } + + public static IEnumerable read_tokens1(object arg1) + { + { + object TokenList = arg1; + Variable C1 = new Variable(); + Variable _X = new Variable(); + Variable ListOfTokens = new Variable(); + foreach (bool l2 in YP.get_code(C1)) + { + foreach (bool l3 in read_tokens(C1, _X, ListOfTokens)) + { + foreach (bool l4 in YP.unify(TokenList, ListOfTokens)) + { + yield return false; + } + yield break; + } + } + } + { + foreach (bool l2 in YP.unify(arg1, new ListPair(new Functor2(@"atom", Atom.a(@"end_of_file"), 0), Atom.NIL))) + { + yield return false; + } + } + } + + public static IEnumerable read_tokens2(object arg1, object arg2) + { + { + object TokenList = arg1; + object Dictionary = arg2; + Variable C1 = new Variable(); + Variable Dict = new Variable(); + Variable ListOfTokens = new Variable(); + foreach (bool l2 in YP.get_code(C1)) + { + foreach (bool l3 in read_tokens(C1, Dict, ListOfTokens)) + { + foreach (bool l4 in terminate_list(Dict)) + { + foreach (bool l5 in YP.unify(Dictionary, Dict)) + { + foreach (bool l6 in YP.unify(TokenList, ListOfTokens)) + { + yield return false; + } + } + yield break; + } + } + } + } + { + foreach (bool l2 in YP.unify(arg1, new ListPair(new Functor2(@"atom", Atom.a(@"end_of_file"), 0), Atom.NIL))) + { + foreach (bool l3 in YP.unify(arg2, Atom.NIL)) + { + yield return false; + } + } + } + } + + public static IEnumerable terminate_list(object arg1) + { + { + foreach (bool l2 in YP.unify(arg1, Atom.NIL)) + { + yield return false; + } + } + { + Variable x1 = new Variable(); + Variable Tail = new Variable(); + foreach (bool l2 in YP.unify(arg1, new ListPair(x1, Tail))) + { + foreach (bool l3 in terminate_list(Tail)) + { + yield return false; + } + } + } + } + + public static IEnumerable read_special(object arg1, object Dict, object arg3) + { + { + object Tokens = arg3; + foreach (bool l2 in YP.unify(arg1, 95)) + { + foreach (bool l3 in read_variable(95, Dict, Tokens)) + { + yield return false; + } + } + } + { + object Tokens = arg3; + foreach (bool l2 in YP.unify(arg1, 247)) + { + foreach (bool l3 in read_symbol(247, Dict, Tokens)) + { + yield return false; + } + } + } + { + object Tokens = arg3; + foreach (bool l2 in YP.unify(arg1, 215)) + { + foreach (bool l3 in read_symbol(215, Dict, Tokens)) + { + yield return false; + } + } + } + { + Variable StartPos = new Variable(); + Variable EndPos = new Variable(); + Variable Tokens = new Variable(); + Variable Ch = new Variable(); + Variable NextCh = new Variable(); + foreach (bool l2 in YP.unify(arg1, 37)) + { + foreach (bool l3 in YP.unify(arg3, new ListPair(new Functor2(@"comment", StartPos, EndPos), Tokens))) + { + foreach (bool l4 in get_current_position(StartPos)) + { + foreach (bool l5 in YP.repeat()) + { + foreach (bool l6 in YP.get_code(Ch)) + { + if (YP.lessThan(Ch, new ListPair(32, Atom.NIL))) + { + if (YP.notEqual(Ch, 9)) + { + if (YP.termNotEqual(Ch, -1)) + { + foreach (bool l10 in get_current_position(EndPos)) + { + foreach (bool l11 in YP.get_code(NextCh)) + { + foreach (bool l12 in read_tokens(NextCh, Dict, Tokens)) + { + yield return false; + } + } + } + } + yield break; + } + } + } + } + } + } + } + } + { + object T = arg3; + Variable C2 = new Variable(); + Variable StartPos = new Variable(); + Variable EndPos = new Variable(); + Variable Tokens = new Variable(); + Variable StartPos1 = new Variable(); + Variable NextCh = new Variable(); + Variable Chars = new Variable(); + foreach (bool l2 in YP.unify(arg1, 47)) + { + foreach (bool l3 in YP.get_code(C2)) + { + if (YP.equal(C2, new ListPair(42, Atom.NIL))) + { + foreach (bool l5 in YP.unify(T, new ListPair(new Functor2(@"comment", StartPos, EndPos), Tokens))) + { + foreach (bool l6 in get_current_position(StartPos1)) + { + foreach (bool l7 in YP.unify(StartPos, YP.subtract(StartPos1, 1))) + { + foreach (bool l8 in read_solidus(32, NextCh)) + { + foreach (bool l9 in get_current_position(EndPos)) + { + foreach (bool l10 in read_tokens(NextCh, Dict, Tokens)) + { + yield return false; + } + } + } + } + } + } + goto cutIf1; + } + foreach (bool l4 in YP.unify(T, Tokens)) + { + foreach (bool l5 in rest_symbol(C2, Chars, NextCh)) + { + foreach (bool l6 in read_after_atom4(NextCh, Dict, Tokens, new ListPair(47, Chars))) + { + yield return false; + } + } + } + cutIf1: + { } + } + } + } + { + Variable Pos = new Variable(); + Variable Tokens = new Variable(); + Variable NextCh = new Variable(); + foreach (bool l2 in YP.unify(arg1, 33)) + { + foreach (bool l3 in YP.unify(arg3, new ListPair(new Functor2(@"atom", Atom.a(@"!"), Pos), Tokens))) + { + foreach (bool l4 in get_current_position(Pos)) + { + foreach (bool l5 in YP.get_code(NextCh)) + { + foreach (bool l6 in read_after_atom(NextCh, Dict, Tokens)) + { + yield return false; + } + } + } + } + } + } + { + Variable Tokens = new Variable(); + Variable NextCh = new Variable(); + foreach (bool l2 in YP.unify(arg1, 40)) + { + foreach (bool l3 in YP.unify(arg3, new ListPair(Atom.a(@" ("), Tokens))) + { + foreach (bool l4 in YP.get_code(NextCh)) + { + foreach (bool l5 in read_tokens(NextCh, Dict, Tokens)) + { + yield return false; + } + } + } + } + } + { + Variable Tokens = new Variable(); + Variable NextCh = new Variable(); + foreach (bool l2 in YP.unify(arg1, 41)) + { + foreach (bool l3 in YP.unify(arg3, new ListPair(Atom.a(@")"), Tokens))) + { + foreach (bool l4 in YP.get_code(NextCh)) + { + foreach (bool l5 in read_tokens(NextCh, Dict, Tokens)) + { + yield return false; + } + } + } + } + } + { + Variable Tokens = new Variable(); + Variable NextCh = new Variable(); + foreach (bool l2 in YP.unify(arg1, 44)) + { + foreach (bool l3 in YP.unify(arg3, new ListPair(Atom.a(@","), Tokens))) + { + foreach (bool l4 in YP.get_code(NextCh)) + { + foreach (bool l5 in read_tokens(NextCh, Dict, Tokens)) + { + yield return false; + } + } + } + } + } + { + Variable Pos = new Variable(); + Variable Tokens = new Variable(); + Variable NextCh = new Variable(); + foreach (bool l2 in YP.unify(arg1, 59)) + { + foreach (bool l3 in YP.unify(arg3, new ListPair(new Functor2(@"atom", Atom.a(@";"), Pos), Tokens))) + { + foreach (bool l4 in get_current_position(Pos)) + { + foreach (bool l5 in YP.get_code(NextCh)) + { + foreach (bool l6 in read_after_atom(NextCh, Dict, Tokens)) + { + yield return false; + } + } + } + } + } + } + { + Variable Pos = new Variable(); + Variable Tokens = new Variable(); + Variable NextCh = new Variable(); + foreach (bool l2 in YP.unify(arg1, 91)) + { + foreach (bool l3 in YP.unify(arg3, new ListPair(new Functor2(@"/", Atom.a(@"["), Pos), Tokens))) + { + foreach (bool l4 in get_current_position(Pos)) + { + foreach (bool l5 in YP.get_code(NextCh)) + { + foreach (bool l6 in read_tokens(NextCh, Dict, Tokens)) + { + yield return false; + } + } + } + } + } + } + { + Variable Pos = new Variable(); + Variable Tokens = new Variable(); + Variable NextCh = new Variable(); + foreach (bool l2 in YP.unify(arg1, 93)) + { + foreach (bool l3 in YP.unify(arg3, new ListPair(new Functor2(@"/", Atom.a(@"]"), Pos), Tokens))) + { + foreach (bool l4 in get_current_position(Pos)) + { + foreach (bool l5 in YP.get_code(NextCh)) + { + foreach (bool l6 in read_after_atom(NextCh, Dict, Tokens)) + { + yield return false; + } + } + } + } + } + } + { + Variable Pos = new Variable(); + Variable Tokens = new Variable(); + Variable NextCh = new Variable(); + foreach (bool l2 in YP.unify(arg1, 123)) + { + foreach (bool l3 in YP.unify(arg3, new ListPair(new Functor2(@"/", Atom.a(@"{"), Pos), Tokens))) + { + foreach (bool l4 in get_current_position(Pos)) + { + foreach (bool l5 in YP.get_code(NextCh)) + { + foreach (bool l6 in read_tokens(NextCh, Dict, Tokens)) + { + yield return false; + } + } + } + } + } + } + { + Variable Tokens = new Variable(); + Variable NextCh = new Variable(); + foreach (bool l2 in YP.unify(arg1, 124)) + { + foreach (bool l3 in YP.unify(arg3, new ListPair(Atom.a(@"|"), Tokens))) + { + foreach (bool l4 in YP.get_code(NextCh)) + { + foreach (bool l5 in read_tokens(NextCh, Dict, Tokens)) + { + yield return false; + } + } + } + } + } + { + Variable Tokens = new Variable(); + Variable NextCh = new Variable(); + foreach (bool l2 in YP.unify(arg1, 125)) + { + foreach (bool l3 in YP.unify(arg3, new ListPair(Atom.a(@"}"), Tokens))) + { + foreach (bool l4 in YP.get_code(NextCh)) + { + foreach (bool l5 in read_after_atom(NextCh, Dict, Tokens)) + { + yield return false; + } + } + } + } + } + { + object Tokens = arg3; + Variable NextCh = new Variable(); + foreach (bool l2 in YP.unify(arg1, 46)) + { + foreach (bool l3 in YP.get_code(NextCh)) + { + foreach (bool l4 in read_fullstop(NextCh, Dict, Tokens)) + { + yield return false; + } + } + } + } + { + Variable Chars = new Variable(); + Variable Tokens = new Variable(); + Variable NextCh = new Variable(); + foreach (bool l2 in YP.unify(arg1, 34)) + { + foreach (bool l3 in YP.unify(arg3, new ListPair(new Functor1(@"string", Chars), Tokens))) + { + foreach (bool l4 in read_string(Chars, 34, NextCh)) + { + foreach (bool l5 in read_tokens(NextCh, Dict, Tokens)) + { + yield return false; + } + } + } + } + } + { + object Tokens = arg3; + Variable Chars = new Variable(); + Variable NextCh = new Variable(); + foreach (bool l2 in YP.unify(arg1, 39)) + { + foreach (bool l3 in read_string(Chars, 39, NextCh)) + { + foreach (bool l4 in read_after_atom4(NextCh, Dict, Tokens, Chars)) + { + yield return false; + } + } + } + } + { + object Tokens = arg3; + foreach (bool l2 in YP.unify(arg1, 35)) + { + foreach (bool l3 in read_symbol(35, Dict, Tokens)) + { + yield return false; + } + } + } + { + object Tokens = arg3; + foreach (bool l2 in YP.unify(arg1, 36)) + { + foreach (bool l3 in read_symbol(36, Dict, Tokens)) + { + yield return false; + } + } + } + { + object Tokens = arg3; + foreach (bool l2 in YP.unify(arg1, 38)) + { + foreach (bool l3 in read_symbol(38, Dict, Tokens)) + { + yield return false; + } + } + } + { + object Tokens = arg3; + foreach (bool l2 in YP.unify(arg1, 42)) + { + foreach (bool l3 in read_symbol(42, Dict, Tokens)) + { + yield return false; + } + } + } + { + object Tokens = arg3; + foreach (bool l2 in YP.unify(arg1, 43)) + { + foreach (bool l3 in read_symbol(43, Dict, Tokens)) + { + yield return false; + } + } + } + { + object Tokens = arg3; + foreach (bool l2 in YP.unify(arg1, 45)) + { + foreach (bool l3 in read_symbol(45, Dict, Tokens)) + { + yield return false; + } + } + } + { + object Tokens = arg3; + foreach (bool l2 in YP.unify(arg1, 58)) + { + foreach (bool l3 in read_symbol(58, Dict, Tokens)) + { + yield return false; + } + } + } + { + object Tokens = arg3; + foreach (bool l2 in YP.unify(arg1, 60)) + { + foreach (bool l3 in read_symbol(60, Dict, Tokens)) + { + yield return false; + } + } + } + { + object Tokens = arg3; + foreach (bool l2 in YP.unify(arg1, 61)) + { + foreach (bool l3 in read_symbol(61, Dict, Tokens)) + { + yield return false; + } + } + } + { + object Tokens = arg3; + foreach (bool l2 in YP.unify(arg1, 62)) + { + foreach (bool l3 in read_symbol(62, Dict, Tokens)) + { + yield return false; + } + } + } + { + object Tokens = arg3; + foreach (bool l2 in YP.unify(arg1, 63)) + { + foreach (bool l3 in read_symbol(63, Dict, Tokens)) + { + yield return false; + } + } + } + { + object Tokens = arg3; + foreach (bool l2 in YP.unify(arg1, 64)) + { + foreach (bool l3 in read_symbol(64, Dict, Tokens)) + { + yield return false; + } + } + } + { + object Tokens = arg3; + foreach (bool l2 in YP.unify(arg1, 92)) + { + foreach (bool l3 in read_symbol(92, Dict, Tokens)) + { + yield return false; + } + } + } + { + object Tokens = arg3; + foreach (bool l2 in YP.unify(arg1, 94)) + { + foreach (bool l3 in read_symbol(94, Dict, Tokens)) + { + yield return false; + } + } + } + { + object Tokens = arg3; + foreach (bool l2 in YP.unify(arg1, 96)) + { + foreach (bool l3 in read_symbol(96, Dict, Tokens)) + { + yield return false; + } + } + } + { + object Tokens = arg3; + foreach (bool l2 in YP.unify(arg1, 126)) + { + foreach (bool l3 in read_symbol(126, Dict, Tokens)) + { + yield return false; + } + } + } + } + + public static IEnumerable read_symbol(object C1, object Dict, object Tokens) + { + { + Variable C2 = new Variable(); + Variable Chars = new Variable(); + Variable NextCh = new Variable(); + foreach (bool l2 in YP.get_code(C2)) + { + foreach (bool l3 in rest_symbol(C2, Chars, NextCh)) + { + foreach (bool l4 in read_after_atom4(NextCh, Dict, Tokens, new ListPair(C1, Chars))) + { + yield return false; + } + } + } + } + } + + public static IEnumerable rest_symbol(object arg1, object arg2, object arg3) + { + { + object C2 = arg1; + object LastCh = arg3; + Variable Chars = new Variable(); + Variable NextCh = new Variable(); + foreach (bool l2 in YP.unify(arg2, new ListPair(C2, Chars))) + { + if (YP.greaterThan(C2, 160)) + { + if (YP.lessThan(C2, 192)) + { + if (YP.notEqual(C2, 186)) + { + if (YP.notEqual(C2, 170)) + { + foreach (bool l7 in YP.get_code(NextCh)) + { + foreach (bool l8 in rest_symbol(NextCh, Chars, LastCh)) + { + yield return false; + } + } + yield break; + } + } + } + goto cutIf1; + } + foreach (bool l3 in symbol_char(C2)) + { + foreach (bool l4 in YP.get_code(NextCh)) + { + foreach (bool l5 in rest_symbol(NextCh, Chars, LastCh)) + { + yield return false; + } + } + yield break; + } + cutIf1: + { } + } + } + { + Variable C2 = new Variable(); + foreach (bool l2 in YP.unify(arg1, C2)) + { + foreach (bool l3 in YP.unify(arg2, Atom.NIL)) + { + foreach (bool l4 in YP.unify(arg3, C2)) + { + yield return false; + } + } + } + } + } + + public static IEnumerable symbol_char(object arg1) + { + { + foreach (bool l2 in YP.unify(arg1, 35)) + { + yield return false; + } + } + { + foreach (bool l2 in YP.unify(arg1, 36)) + { + yield return false; + } + } + { + foreach (bool l2 in YP.unify(arg1, 38)) + { + yield return false; + } + } + { + foreach (bool l2 in YP.unify(arg1, 42)) + { + yield return false; + } + } + { + foreach (bool l2 in YP.unify(arg1, 43)) + { + yield return false; + } + } + { + foreach (bool l2 in YP.unify(arg1, 45)) + { + yield return false; + } + } + { + foreach (bool l2 in YP.unify(arg1, 46)) + { + yield return false; + } + } + { + foreach (bool l2 in YP.unify(arg1, 47)) + { + yield return false; + } + } + { + foreach (bool l2 in YP.unify(arg1, 58)) + { + yield return false; + } + } + { + foreach (bool l2 in YP.unify(arg1, 60)) + { + yield return false; + } + } + { + foreach (bool l2 in YP.unify(arg1, 61)) + { + yield return false; + } + } + { + foreach (bool l2 in YP.unify(arg1, 62)) + { + yield return false; + } + } + { + foreach (bool l2 in YP.unify(arg1, 63)) + { + yield return false; + } + } + { + foreach (bool l2 in YP.unify(arg1, 64)) + { + yield return false; + } + } + { + foreach (bool l2 in YP.unify(arg1, 92)) + { + yield return false; + } + } + { + foreach (bool l2 in YP.unify(arg1, 94)) + { + yield return false; + } + } + { + foreach (bool l2 in YP.unify(arg1, 96)) + { + yield return false; + } + } + { + foreach (bool l2 in YP.unify(arg1, 126)) + { + yield return false; + } + } + } + + public static IEnumerable get_current_position(object Pos) + { + { + foreach (bool l2 in YP.unify(Pos, 0)) + { + yield return false; + } + } + } + + public static IEnumerable read_after_atom4(object Ch, object Dict, object arg3, object Chars) + { + { + Variable Atom_1 = new Variable(); + Variable Pos = new Variable(); + Variable Tokens = new Variable(); + foreach (bool l2 in YP.unify(arg3, new ListPair(new Functor2(@"atom", Atom_1, Pos), Tokens))) + { + foreach (bool l3 in YP.unify(Pos, 0)) + { + foreach (bool l4 in YP.atom_codes(Atom_1, Chars)) + { + foreach (bool l5 in read_after_atom(Ch, Dict, Tokens)) + { + yield return false; + } + } + } + } + } + } + + public static IEnumerable read_after_atom(object arg1, object Dict, object arg3) + { + { + Variable Tokens = new Variable(); + Variable NextCh = new Variable(); + foreach (bool l2 in YP.unify(arg1, 40)) + { + foreach (bool l3 in YP.unify(arg3, new ListPair(Atom.a(@"("), Tokens))) + { + foreach (bool l4 in YP.get_code(NextCh)) + { + foreach (bool l5 in read_tokens(NextCh, Dict, Tokens)) + { + yield return false; + } + } + yield break; + } + } + } + { + object Ch = arg1; + object Tokens = arg3; + foreach (bool l2 in read_tokens(Ch, Dict, Tokens)) + { + yield return false; + } + } + } + + public static IEnumerable read_string(object Chars, object Quote, object NextCh) + { + { + Variable Ch = new Variable(); + Variable Char = new Variable(); + Variable Next = new Variable(); + foreach (bool l2 in YP.get_code(Ch)) + { + foreach (bool l3 in read_char(Ch, Quote, Char, Next)) + { + foreach (bool l4 in rest_string5(Char, Next, Chars, Quote, NextCh)) + { + yield return false; + } + } + } + } + } + + public static IEnumerable rest_string5(object arg1, object arg2, object arg3, object arg4, object arg5) + { + { + object _X = arg4; + Variable NextCh = new Variable(); + foreach (bool l2 in YP.unify(arg1, -1)) + { + foreach (bool l3 in YP.unify(arg2, NextCh)) + { + foreach (bool l4 in YP.unify(arg3, Atom.NIL)) + { + foreach (bool l5 in YP.unify(arg5, NextCh)) + { + yield return true; + yield break; + } + } + } + } + } + { + object Char = arg1; + object Next = arg2; + object Quote = arg4; + object NextCh = arg5; + Variable Chars = new Variable(); + Variable Char2 = new Variable(); + Variable Next2 = new Variable(); + foreach (bool l2 in YP.unify(arg3, new ListPair(Char, Chars))) + { + foreach (bool l3 in read_char(Next, Quote, Char2, Next2)) + { + foreach (bool l4 in rest_string5(Char2, Next2, Chars, Quote, NextCh)) + { + yield return false; + } + } + } + } + } + + public static IEnumerable escape_char(object arg1, object arg2) + { + { + foreach (bool l2 in YP.unify(arg1, 110)) + { + foreach (bool l3 in YP.unify(arg2, 10)) + { + yield return false; + } + } + } + { + foreach (bool l2 in YP.unify(arg1, 78)) + { + foreach (bool l3 in YP.unify(arg2, 10)) + { + yield return false; + } + } + } + { + foreach (bool l2 in YP.unify(arg1, 116)) + { + foreach (bool l3 in YP.unify(arg2, 9)) + { + yield return false; + } + } + } + { + foreach (bool l2 in YP.unify(arg1, 84)) + { + foreach (bool l3 in YP.unify(arg2, 9)) + { + yield return false; + } + } + } + { + foreach (bool l2 in YP.unify(arg1, 114)) + { + foreach (bool l3 in YP.unify(arg2, 13)) + { + yield return false; + } + } + } + { + foreach (bool l2 in YP.unify(arg1, 82)) + { + foreach (bool l3 in YP.unify(arg2, 13)) + { + yield return false; + } + } + } + { + foreach (bool l2 in YP.unify(arg1, 118)) + { + foreach (bool l3 in YP.unify(arg2, 11)) + { + yield return false; + } + } + } + { + foreach (bool l2 in YP.unify(arg1, 86)) + { + foreach (bool l3 in YP.unify(arg2, 11)) + { + yield return false; + } + } + } + { + foreach (bool l2 in YP.unify(arg1, 98)) + { + foreach (bool l3 in YP.unify(arg2, 8)) + { + yield return false; + } + } + } + { + foreach (bool l2 in YP.unify(arg1, 66)) + { + foreach (bool l3 in YP.unify(arg2, 8)) + { + yield return false; + } + } + } + { + foreach (bool l2 in YP.unify(arg1, 102)) + { + foreach (bool l3 in YP.unify(arg2, 12)) + { + yield return false; + } + } + } + { + foreach (bool l2 in YP.unify(arg1, 70)) + { + foreach (bool l3 in YP.unify(arg2, 12)) + { + yield return false; + } + } + } + { + foreach (bool l2 in YP.unify(arg1, 101)) + { + foreach (bool l3 in YP.unify(arg2, 27)) + { + yield return false; + } + } + } + { + foreach (bool l2 in YP.unify(arg1, 69)) + { + foreach (bool l3 in YP.unify(arg2, 27)) + { + yield return false; + } + } + } + { + foreach (bool l2 in YP.unify(arg1, 100)) + { + foreach (bool l3 in YP.unify(arg2, 127)) + { + yield return false; + } + } + } + { + foreach (bool l2 in YP.unify(arg1, 68)) + { + foreach (bool l3 in YP.unify(arg2, 127)) + { + yield return false; + } + } + } + { + foreach (bool l2 in YP.unify(arg1, 115)) + { + foreach (bool l3 in YP.unify(arg2, 32)) + { + yield return false; + } + } + } + { + foreach (bool l2 in YP.unify(arg1, 83)) + { + foreach (bool l3 in YP.unify(arg2, 32)) + { + yield return false; + } + } + } + { + foreach (bool l2 in YP.unify(arg1, 122)) + { + foreach (bool l3 in YP.unify(arg2, -1)) + { + yield return false; + } + } + } + { + foreach (bool l2 in YP.unify(arg1, 90)) + { + foreach (bool l3 in YP.unify(arg2, -1)) + { + yield return false; + } + } + } + } + + public static IEnumerable read_variable(object C1, object Dict, object arg3) + { + { + Variable Var = new Variable(); + Variable Name = new Variable(); + Variable StartPos = new Variable(); + Variable Tokens = new Variable(); + Variable Chars = new Variable(); + Variable NextCh = new Variable(); + foreach (bool l2 in YP.unify(arg3, new ListPair(new Functor3(@"var", Var, Name, StartPos), Tokens))) + { + foreach (bool l3 in get_current_position(StartPos)) + { + foreach (bool l4 in read_name(C1, Chars, NextCh)) + { + foreach (bool l5 in YP.atom_codes(Name, Chars)) + { + if (YP.termEqual(Name, Atom.a(@"_"))) + { + foreach (bool l7 in read_after_atom(NextCh, Dict, Tokens)) + { + yield return false; + } + goto cutIf1; + } + foreach (bool l6 in read_lookup(Dict, Name, Var)) + { + foreach (bool l7 in read_after_atom(NextCh, Dict, Tokens)) + { + yield return false; + } + } + cutIf1: + { } + } + } + } + } + } + } + + public static IEnumerable read_lookup(object arg1, object Name, object Var) + { + { + Variable N = new Variable(); + Variable V = new Variable(); + Variable L = new Variable(); + foreach (bool l2 in YP.unify(arg1, new ListPair(new Functor2(@"=", N, V), L))) + { + foreach (bool l3 in YP.unify(N, Name)) + { + foreach (bool l4 in YP.unify(V, Var)) + { + yield return false; + } + goto cutIf1; + } + foreach (bool l3 in read_lookup(L, Name, Var)) + { + yield return false; + } + cutIf1: + { } + } + } + } + + public static IEnumerable read_solidus(object Ch, object LastCh) + { + { + Variable NextCh = new Variable(); + if (YP.equal(Ch, 42)) + { + foreach (bool l3 in YP.get_code(NextCh)) + { + if (YP.equal(NextCh, 47)) + { + foreach (bool l5 in YP.get_code(LastCh)) + { + yield return false; + } + goto cutIf2; + } + foreach (bool l4 in read_solidus(NextCh, LastCh)) + { + yield return false; + } + cutIf2: + { } + } + goto cutIf1; + } + if (YP.notEqual(Ch, -1)) + { + foreach (bool l3 in YP.get_code(NextCh)) + { + foreach (bool l4 in read_solidus(NextCh, LastCh)) + { + yield return false; + } + } + goto cutIf3; + } + foreach (bool l2 in YP.unify(LastCh, Ch)) + { + foreach (bool l3 in formatError(Atom.a(@"user_error"), Atom.a(@"~N** end of file in /*comment~n"), Atom.NIL)) + { + yield return false; + } + } + cutIf3: + cutIf1: + { } + } + } + + public static IEnumerable read_identifier(object C1, object Dict, object Tokens) + { + { + Variable Chars = new Variable(); + Variable NextCh = new Variable(); + foreach (bool l2 in read_name(C1, Chars, NextCh)) + { + foreach (bool l3 in read_after_atom4(NextCh, Dict, Tokens, Chars)) + { + yield return false; + } + } + } + } + + public static IEnumerable read_name(object C1, object arg2, object LastCh) + { + { + Variable Chars = new Variable(); + Variable C2 = new Variable(); + foreach (bool l2 in YP.unify(arg2, new ListPair(C1, Chars))) + { + foreach (bool l3 in YP.get_code(C2)) + { + if (YP.greaterThanOrEqual(C2, new ListPair(97, Atom.NIL))) + { + if (YP.lessThanOrEqual(C2, new ListPair(122, Atom.NIL))) + { + foreach (bool l6 in read_name(C2, Chars, LastCh)) + { + yield return false; + } + goto cutIf2; + } + if (YP.lessThan(C2, 192)) + { + if (YP.notEqual(YP.bitwiseOr(C2, 16), 186)) + { + foreach (bool l7 in YP.unify(Chars, Atom.NIL)) + { + foreach (bool l8 in YP.unify(LastCh, C2)) + { + yield return false; + } + } + goto cutIf3; + } + } + if (YP.equal(YP.bitwiseOr(C2, 32), 247)) + { + foreach (bool l6 in YP.unify(Chars, Atom.NIL)) + { + foreach (bool l7 in YP.unify(LastCh, C2)) + { + yield return false; + } + } + goto cutIf4; + } + foreach (bool l5 in read_name(C2, Chars, LastCh)) + { + yield return false; + } + cutIf4: + cutIf3: + cutIf2: + goto cutIf1; + } + if (YP.greaterThanOrEqual(C2, new ListPair(65, Atom.NIL))) + { + if (YP.greaterThan(C2, new ListPair(90, Atom.NIL))) + { + if (YP.notEqual(C2, new ListPair(95, Atom.NIL))) + { + foreach (bool l7 in YP.unify(Chars, Atom.NIL)) + { + foreach (bool l8 in YP.unify(LastCh, C2)) + { + yield return false; + } + } + goto cutIf6; + } + } + foreach (bool l5 in read_name(C2, Chars, LastCh)) + { + yield return false; + } + cutIf6: + goto cutIf5; + } + if (YP.greaterThanOrEqual(C2, new ListPair(48, Atom.NIL))) + { + if (YP.lessThanOrEqual(C2, new ListPair(57, Atom.NIL))) + { + foreach (bool l6 in read_name(C2, Chars, LastCh)) + { + yield return false; + } + goto cutIf7; + } + } + foreach (bool l4 in YP.unify(Chars, Atom.NIL)) + { + foreach (bool l5 in YP.unify(LastCh, C2)) + { + yield return false; + } + } + cutIf7: + cutIf5: + cutIf1: + { } + } + } + } + } + + public static IEnumerable read_fullstop(object Ch, object Dict, object Tokens) + { + { + Variable Number = new Variable(); + Variable Tokens1 = new Variable(); + Variable Chars = new Variable(); + Variable NextCh = new Variable(); + if (YP.lessThanOrEqual(Ch, new ListPair(57, Atom.NIL))) + { + if (YP.greaterThanOrEqual(Ch, new ListPair(48, Atom.NIL))) + { + foreach (bool l4 in YP.unify(Tokens, new ListPair(new Functor1(@"number", Number), Tokens1))) + { + foreach (bool l5 in read_float(Number, Dict, Tokens1, new ListPair(48, Atom.NIL), Ch)) + { + yield return false; + } + } + goto cutIf1; + } + } + if (YP.greaterThan(Ch, new ListPair(32, Atom.NIL))) + { + foreach (bool l3 in rest_symbol(Ch, Chars, NextCh)) + { + foreach (bool l4 in read_after_atom4(NextCh, Dict, Tokens, new ListPair(46, Chars))) + { + yield return false; + } + } + goto cutIf2; + } + if (YP.greaterThanOrEqual(Ch, 0)) + { + foreach (bool l3 in YP.unify(Tokens, Atom.NIL)) + { + yield return false; + } + goto cutIf3; + } + foreach (bool l2 in formatError(Atom.a(@"user_error"), Atom.a(@"~N** end of file just after full stop~n"), Atom.NIL)) + { + } + cutIf3: + cutIf2: + cutIf1: + { } + } + } + + public static IEnumerable read_float(object Number, object Dict, object Tokens, object Digits, object Digit) + { + { + Variable Chars = new Variable(); + Variable Rest = new Variable(); + Variable NextCh = new Variable(); + foreach (bool l2 in prepend(Digits, Chars, Rest)) + { + foreach (bool l3 in read_float(Digit, Rest, NextCh, Chars)) + { + foreach (bool l4 in YP.number_codes(Number, Chars)) + { + foreach (bool l5 in read_tokens(NextCh, Dict, Tokens)) + { + yield return false; + } + } + } + } + } + } + + public static IEnumerable prepend(object arg1, object arg2, object arg3) + { + { + object X = arg3; + foreach (bool l2 in YP.unify(arg1, Atom.NIL)) + { + foreach (bool l3 in YP.unify(arg2, new ListPair(46, X))) + { + yield return false; + } + } + } + { + object Y = arg3; + Variable C = new Variable(); + Variable Cs = new Variable(); + Variable X = new Variable(); + foreach (bool l2 in YP.unify(arg1, new ListPair(C, Cs))) + { + foreach (bool l3 in YP.unify(arg2, new ListPair(C, X))) + { + foreach (bool l4 in prepend(Cs, X, Y)) + { + yield return false; + } + } + } + } + } + + public static IEnumerable read_float(object C1, object arg2, object NextCh, object Total) + { + { + Variable Chars = new Variable(); + Variable C2 = new Variable(); + Variable C3 = new Variable(); + Variable C4 = new Variable(); + Variable More = new Variable(); + foreach (bool l2 in YP.unify(arg2, new ListPair(C1, Chars))) + { + foreach (bool l3 in YP.get_code(C2)) + { + if (YP.greaterThanOrEqual(C2, new ListPair(48, Atom.NIL))) + { + if (YP.lessThanOrEqual(C2, new ListPair(57, Atom.NIL))) + { + foreach (bool l6 in read_float(C2, Chars, NextCh, Total)) + { + yield return false; + } + goto cutIf1; + } + } + if (YP.equal(YP.bitwiseOr(C2, 32), new ListPair(101, Atom.NIL))) + { + foreach (bool l5 in YP.get_code(C3)) + { + if (YP.equal(C3, new ListPair(45, Atom.NIL))) + { + foreach (bool l7 in YP.get_code(C4)) + { + foreach (bool l8 in YP.unify(Chars, new ListPair(C2, new ListPair(45, More)))) + { + if (YP.greaterThanOrEqual(C4, new ListPair(48, Atom.NIL))) + { + if (YP.lessThanOrEqual(C4, new ListPair(57, Atom.NIL))) + { + foreach (bool l11 in read_exponent(C4, More, NextCh)) + { + yield return false; + } + goto cutIf4; + } + } + foreach (bool l9 in YP.unify(More, Atom.NIL)) + { + foreach (bool l10 in formatError(Atom.a(@"user_error"), Atom.a(@"~N** Missing exponent in ~s~n"), new ListPair(Total, Atom.NIL))) + { + } + } + foreach (bool l9 in YP.unify(More, new ListPair(48, Atom.NIL))) + { + foreach (bool l10 in YP.unify(NextCh, C4)) + { + yield return false; + } + } + cutIf4: + { } + } + } + goto cutIf3; + } + if (YP.equal(C3, new ListPair(43, Atom.NIL))) + { + foreach (bool l7 in YP.get_code(C4)) + { + foreach (bool l8 in YP.unify(Chars, new ListPair(C2, More))) + { + if (YP.greaterThanOrEqual(C4, new ListPair(48, Atom.NIL))) + { + if (YP.lessThanOrEqual(C4, new ListPair(57, Atom.NIL))) + { + foreach (bool l11 in read_exponent(C4, More, NextCh)) + { + yield return false; + } + goto cutIf6; + } + } + foreach (bool l9 in YP.unify(More, Atom.NIL)) + { + foreach (bool l10 in formatError(Atom.a(@"user_error"), Atom.a(@"~N** Missing exponent in ~s~n"), new ListPair(Total, Atom.NIL))) + { + } + } + foreach (bool l9 in YP.unify(More, new ListPair(48, Atom.NIL))) + { + foreach (bool l10 in YP.unify(NextCh, C4)) + { + yield return false; + } + } + cutIf6: + { } + } + } + goto cutIf5; + } + foreach (bool l6 in YP.unify(C4, C3)) + { + foreach (bool l7 in YP.unify(Chars, new ListPair(C2, More))) + { + if (YP.greaterThanOrEqual(C4, new ListPair(48, Atom.NIL))) + { + if (YP.lessThanOrEqual(C4, new ListPair(57, Atom.NIL))) + { + foreach (bool l10 in read_exponent(C4, More, NextCh)) + { + yield return false; + } + goto cutIf7; + } + } + foreach (bool l8 in YP.unify(More, Atom.NIL)) + { + foreach (bool l9 in formatError(Atom.a(@"user_error"), Atom.a(@"~N** Missing exponent in ~s~n"), new ListPair(Total, Atom.NIL))) + { + } + } + foreach (bool l8 in YP.unify(More, new ListPair(48, Atom.NIL))) + { + foreach (bool l9 in YP.unify(NextCh, C4)) + { + yield return false; + } + } + cutIf7: + { } + } + } + cutIf5: + cutIf3: + { } + } + goto cutIf2; + } + foreach (bool l4 in YP.unify(Chars, Atom.NIL)) + { + foreach (bool l5 in YP.unify(NextCh, C2)) + { + yield return false; + } + } + cutIf2: + cutIf1: + { } + } + } + } + } + + public static IEnumerable read_exponent(object C1, object arg2, object NextCh) + { + { + Variable Chars = new Variable(); + Variable C2 = new Variable(); + foreach (bool l2 in YP.unify(arg2, new ListPair(C1, Chars))) + { + foreach (bool l3 in YP.get_code(C2)) + { + if (YP.greaterThanOrEqual(C2, new ListPair(48, Atom.NIL))) + { + if (YP.lessThanOrEqual(C2, new ListPair(57, Atom.NIL))) + { + foreach (bool l6 in read_exponent(C2, Chars, NextCh)) + { + yield return false; + } + goto cutIf1; + } + } + foreach (bool l4 in YP.unify(Chars, Atom.NIL)) + { + foreach (bool l5 in YP.unify(NextCh, C2)) + { + yield return false; + } + } + cutIf1: + { } + } + } + } + } + + public static IEnumerable read_number(object C1, object Dict, object arg3) + { + { + Variable Number = new Variable(); + Variable Tokens = new Variable(); + Variable C2 = new Variable(); + Variable N = new Variable(); + Variable C = new Variable(); + Variable C3 = new Variable(); + Variable Digits = new Variable(); + foreach (bool l2 in YP.unify(arg3, new ListPair(new Functor1(@"number", Number), Tokens))) + { + foreach (bool l3 in read_number4(C1, C2, 0, N)) + { + if (YP.equal(C2, 39)) + { + if (YP.greaterThanOrEqual(N, 2)) + { + if (YP.lessThanOrEqual(N, 36)) + { + foreach (bool l7 in read_based(N, 0, Number, C)) + { + foreach (bool l8 in read_tokens(C, Dict, Tokens)) + { + yield return false; + } + } + goto cutIf2; + } + } + if (YP.equal(N, 0)) + { + foreach (bool l6 in YP.get_code(C3)) + { + foreach (bool l7 in read_char(C3, -1, Number, C)) + { + foreach (bool l8 in read_tokens(C, Dict, Tokens)) + { + yield return false; + } + } + } + goto cutIf3; + } + foreach (bool l5 in formatError(Atom.a(@"user_error"), Atom.a(@"~N** ~d' read as ~d '~n"), new ListPair(N, new ListPair(N, Atom.NIL)))) + { + foreach (bool l6 in YP.unify(Number, N)) + { + foreach (bool l7 in YP.unify(C, C2)) + { + foreach (bool l8 in read_tokens(C, Dict, Tokens)) + { + yield return false; + } + } + } + } + cutIf3: + cutIf2: + goto cutIf1; + } + if (YP.equal(C2, 46)) + { + foreach (bool l5 in YP.get_code(C3)) + { + if (YP.greaterThanOrEqual(C3, new ListPair(48, Atom.NIL))) + { + if (YP.lessThanOrEqual(C3, new ListPair(57, Atom.NIL))) + { + foreach (bool l8 in YP.number_codes(N, Digits)) + { + foreach (bool l9 in read_float(Number, Dict, Tokens, Digits, C3)) + { + yield return false; + } + } + goto cutIf5; + } + } + foreach (bool l6 in YP.unify(Number, N)) + { + foreach (bool l7 in read_fullstop(C3, Dict, Tokens)) + { + yield return false; + } + } + cutIf5: + { } + } + goto cutIf4; + } + foreach (bool l4 in YP.unify(Number, N)) + { + foreach (bool l5 in read_tokens(C2, Dict, Tokens)) + { + yield return false; + } + } + cutIf4: + cutIf1: + { } + } + } + } + } + + public static IEnumerable read_number4(object C0, object C, object N0, object N) + { + { + Variable N1 = new Variable(); + Variable C1 = new Variable(); + if (YP.greaterThanOrEqual(C0, new ListPair(48, Atom.NIL))) + { + if (YP.lessThanOrEqual(C0, new ListPair(57, Atom.NIL))) + { + foreach (bool l4 in YP.unify(N1, YP.add(YP.subtract(YP.multiply(N0, 10), new ListPair(48, Atom.NIL)), C0))) + { + foreach (bool l5 in YP.get_code(C1)) + { + foreach (bool l6 in read_number4(C1, C, N1, N)) + { + yield return false; + } + } + } + goto cutIf1; + } + } + if (YP.equal(C0, 95)) + { + foreach (bool l3 in YP.get_code(C1)) + { + foreach (bool l4 in read_number4(C1, C, N0, N)) + { + yield return false; + } + } + goto cutIf2; + } + foreach (bool l2 in YP.unify(C, C0)) + { + foreach (bool l3 in YP.unify(N, N0)) + { + yield return false; + } + } + cutIf2: + cutIf1: + { } + } + } + + public static IEnumerable read_based(object Base, object N0, object N, object C) + { + { + Variable C1 = new Variable(); + Variable Digit = new Variable(); + Variable N1 = new Variable(); + foreach (bool l2 in YP.get_code(C1)) + { + if (YP.greaterThanOrEqual(C1, new ListPair(48, Atom.NIL))) + { + if (YP.lessThanOrEqual(C1, new ListPair(57, Atom.NIL))) + { + foreach (bool l5 in YP.unify(Digit, YP.subtract(C1, new ListPair(48, Atom.NIL)))) + { + if (YP.lessThan(Digit, Base)) + { + foreach (bool l7 in YP.unify(N1, YP.add(YP.multiply(N0, Base), Digit))) + { + foreach (bool l8 in read_based(Base, N1, N, C)) + { + yield return false; + } + } + goto cutIf2; + } + if (YP.equal(C1, new ListPair(95, Atom.NIL))) + { + foreach (bool l7 in read_based(Base, N0, N, C)) + { + yield return false; + } + goto cutIf3; + } + foreach (bool l6 in YP.unify(N, N0)) + { + foreach (bool l7 in YP.unify(C, C1)) + { + yield return false; + } + } + cutIf3: + cutIf2: + { } + } + goto cutIf1; + } + } + if (YP.greaterThanOrEqual(C1, new ListPair(65, Atom.NIL))) + { + if (YP.lessThanOrEqual(C1, new ListPair(90, Atom.NIL))) + { + foreach (bool l5 in YP.unify(Digit, YP.subtract(C1, YP.subtract(new ListPair(65, Atom.NIL), 10)))) + { + if (YP.lessThan(Digit, Base)) + { + foreach (bool l7 in YP.unify(N1, YP.add(YP.multiply(N0, Base), Digit))) + { + foreach (bool l8 in read_based(Base, N1, N, C)) + { + yield return false; + } + } + goto cutIf5; + } + if (YP.equal(C1, new ListPair(95, Atom.NIL))) + { + foreach (bool l7 in read_based(Base, N0, N, C)) + { + yield return false; + } + goto cutIf6; + } + foreach (bool l6 in YP.unify(N, N0)) + { + foreach (bool l7 in YP.unify(C, C1)) + { + yield return false; + } + } + cutIf6: + cutIf5: + { } + } + goto cutIf4; + } + } + if (YP.greaterThanOrEqual(C1, new ListPair(97, Atom.NIL))) + { + if (YP.lessThanOrEqual(C1, new ListPair(122, Atom.NIL))) + { + foreach (bool l5 in YP.unify(Digit, YP.subtract(C1, YP.subtract(new ListPair(97, Atom.NIL), 10)))) + { + if (YP.lessThan(Digit, Base)) + { + foreach (bool l7 in YP.unify(N1, YP.add(YP.multiply(N0, Base), Digit))) + { + foreach (bool l8 in read_based(Base, N1, N, C)) + { + yield return false; + } + } + goto cutIf8; + } + if (YP.equal(C1, new ListPair(95, Atom.NIL))) + { + foreach (bool l7 in read_based(Base, N0, N, C)) + { + yield return false; + } + goto cutIf9; + } + foreach (bool l6 in YP.unify(N, N0)) + { + foreach (bool l7 in YP.unify(C, C1)) + { + yield return false; + } + } + cutIf9: + cutIf8: + { } + } + goto cutIf7; + } + } + foreach (bool l3 in YP.unify(Digit, 99)) + { + if (YP.lessThan(Digit, Base)) + { + foreach (bool l5 in YP.unify(N1, YP.add(YP.multiply(N0, Base), Digit))) + { + foreach (bool l6 in read_based(Base, N1, N, C)) + { + yield return false; + } + } + goto cutIf10; + } + if (YP.equal(C1, new ListPair(95, Atom.NIL))) + { + foreach (bool l5 in read_based(Base, N0, N, C)) + { + yield return false; + } + goto cutIf11; + } + foreach (bool l4 in YP.unify(N, N0)) + { + foreach (bool l5 in YP.unify(C, C1)) + { + yield return false; + } + } + cutIf11: + cutIf10: + { } + } + cutIf7: + cutIf4: + cutIf1: + { } + } + } + } + + public static IEnumerable read_char(object Char, object Quote, object Result, object Next) + { + { + Variable C1 = new Variable(); + Variable C2 = new Variable(); + Variable C3 = new Variable(); + Variable Ch = new Variable(); + if (YP.equal(Char, 92)) + { + foreach (bool l3 in YP.get_code(C1)) + { + if (YP.lessThan(C1, 0)) + { + foreach (bool l5 in formatError(Atom.a(@"user_error"), Atom.a(@"~N** end of file in ~cquoted~c~n"), new ListPair(Quote, new ListPair(Quote, Atom.NIL)))) + { + foreach (bool l6 in YP.unify(Result, -1)) + { + foreach (bool l7 in YP.unify(Next, C1)) + { + yield return false; + } + } + } + goto cutIf2; + } + if (YP.lessThanOrEqual(C1, new ListPair(32, Atom.NIL))) + { + foreach (bool l5 in YP.get_code(C2)) + { + foreach (bool l6 in read_char(C2, Quote, Result, Next)) + { + yield return false; + } + } + goto cutIf3; + } + if (YP.equal(YP.bitwiseOr(C1, 32), new ListPair(99, Atom.NIL))) + { + foreach (bool l5 in YP.get_code(C2)) + { + foreach (bool l6 in read_char(C2, Quote, Result, Next)) + { + yield return false; + } + } + goto cutIf4; + } + if (YP.lessThanOrEqual(C1, new ListPair(55, Atom.NIL))) + { + if (YP.greaterThanOrEqual(C1, new ListPair(48, Atom.NIL))) + { + foreach (bool l6 in YP.get_code(C2)) + { + if (YP.lessThanOrEqual(C2, new ListPair(55, Atom.NIL))) + { + if (YP.greaterThanOrEqual(C2, new ListPair(48, Atom.NIL))) + { + foreach (bool l9 in YP.get_code(C3)) + { + if (YP.lessThanOrEqual(C3, new ListPair(55, Atom.NIL))) + { + if (YP.greaterThanOrEqual(C3, new ListPair(48, Atom.NIL))) + { + foreach (bool l12 in YP.get_code(Next)) + { + foreach (bool l13 in YP.unify(Result, YP.subtract(YP.add(YP.multiply(YP.add(YP.multiply(C1, 8), C2), 8), C3), YP.multiply(73, new ListPair(48, Atom.NIL))))) + { + yield return false; + } + } + goto cutIf7; + } + } + foreach (bool l10 in YP.unify(Next, C3)) + { + foreach (bool l11 in YP.unify(Result, YP.subtract(YP.add(YP.multiply(C1, 8), C2), YP.multiply(9, new ListPair(48, Atom.NIL))))) + { + yield return false; + } + } + cutIf7: + { } + } + goto cutIf6; + } + } + foreach (bool l7 in YP.unify(Next, C2)) + { + foreach (bool l8 in YP.unify(Result, YP.subtract(C1, new ListPair(48, Atom.NIL)))) + { + yield return false; + } + } + cutIf6: + { } + } + goto cutIf5; + } + } + if (YP.equal(C1, new ListPair(94, Atom.NIL))) + { + foreach (bool l5 in YP.get_code(C2)) + { + if (YP.lessThan(C2, 0)) + { + foreach (bool l7 in formatError(Atom.a(@"user_error"), Atom.a(@"~N** end of file in ~c..~c^..~c~n"), new ListPair(Quote, new ListPair(92, new ListPair(Quote, Atom.NIL))))) + { + foreach (bool l8 in YP.unify(Result, -1)) + { + foreach (bool l9 in YP.unify(Next, C2)) + { + yield return false; + } + } + } + goto cutIf9; + } + if (YP.equal(C2, new ListPair(63, Atom.NIL))) + { + foreach (bool l7 in YP.unify(Result, 127)) + { + foreach (bool l8 in YP.get_code(Next)) + { + yield return false; + } + } + goto cutIf10; + } + foreach (bool l6 in YP.unify(Result, YP.bitwiseAnd(C2, 31))) + { + foreach (bool l7 in YP.get_code(Next)) + { + yield return false; + } + } + cutIf10: + cutIf9: + { } + } + goto cutIf8; + } + foreach (bool l4 in escape_char(C1, Result)) + { + foreach (bool l5 in YP.get_code(Next)) + { + yield return false; + } + goto cutIf11; + } + foreach (bool l4 in YP.unify(Result, C1)) + { + foreach (bool l5 in YP.get_code(Next)) + { + yield return false; + } + } + cutIf11: + cutIf8: + cutIf5: + cutIf4: + cutIf3: + cutIf2: + { } + } + goto cutIf1; + } + if (YP.equal(Char, Quote)) + { + foreach (bool l3 in YP.get_code(Ch)) + { + if (YP.equal(Ch, Quote)) + { + foreach (bool l5 in YP.unify(Result, Quote)) + { + foreach (bool l6 in YP.get_code(Next)) + { + yield return false; + } + } + goto cutIf13; + } + foreach (bool l4 in YP.unify(Result, -1)) + { + foreach (bool l5 in YP.unify(Next, Ch)) + { + yield return false; + } + } + cutIf13: + { } + } + goto cutIf12; + } + if (YP.lessThan(Char, new ListPair(32, Atom.NIL))) + { + if (YP.notEqual(Char, 9)) + { + if (YP.notEqual(Char, 10)) + { + if (YP.notEqual(Char, 13)) + { + foreach (bool l6 in YP.unify(Result, -1)) + { + foreach (bool l7 in YP.unify(Next, Char)) + { + foreach (bool l8 in formatError(Atom.a(@"user_error"), Atom.a(@"~N** Strange character ~d ends ~ctoken~c~n"), new ListPair(Char, new ListPair(Quote, new ListPair(Quote, Atom.NIL))))) + { + yield return false; + } + } + } + goto cutIf14; + } + } + } + } + foreach (bool l2 in YP.unify(Result, Char)) + { + foreach (bool l3 in YP.get_code(Next)) + { + yield return false; + } + } + cutIf14: + cutIf12: + cutIf1: + { } + } + } + + } +} diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/YieldProlog/PrologException.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/YieldProlog/PrologException.cs new file mode 100644 index 0000000..f29c751 --- /dev/null +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/YieldProlog/PrologException.cs @@ -0,0 +1,71 @@ +/* + * Copyright (C) 2007-2008, Jeff Thompson + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the copyright holder nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +using System; + +namespace OpenSim.Region.ScriptEngine.Shared.YieldProlog +{ + /// + /// A PrologException is used as the exception thrown by YP.throw(Term). + /// + public class PrologException : Exception + { + public readonly object _term; + + /// + /// Create a PrologException with the given Term. The printable exception message is the full Term. + /// + /// the term of the exception + /// + public PrologException(object Term) + : base(YP.getValue(Term).ToString()) + { + _term = YP.makeCopy(Term, new Variable.CopyStore()); + } + + /// + /// Create a PrologException where the Term is error(ErrorTerm, Message). + /// This uses YP.makeCopy to copy the ErrorTerm and Message so that they are valid after unbinding. + /// + /// the term of the exception + /// the message, converted to a string, to use as the printable exception message + /// + public PrologException(object ErrorTerm, object Message) + : base(YP.getValue(Message).ToString()) + { + _term = YP.makeCopy(new Functor2(Atom.a("error"), ErrorTerm, Message), new Variable.CopyStore()); + } + + public object Term + { + get { return _term; } + } + } +} diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/YieldProlog/UndefinedPredicateException.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/YieldProlog/UndefinedPredicateException.cs new file mode 100644 index 0000000..4b6112f --- /dev/null +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/YieldProlog/UndefinedPredicateException.cs @@ -0,0 +1,62 @@ +/* + * Copyright (C) 2007-2008, Jeff Thompson + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the copyright holder nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +using System; + +namespace OpenSim.Region.ScriptEngine.Shared.YieldProlog +{ + /// + /// An UndefinedPredicateException extends PrologException to create an existence_error exception. + /// + public class UndefinedPredicateException : PrologException + { + private Atom _predicateName; + private int _arity; + + public UndefinedPredicateException(object message, Atom predicateName, int arity) + : base(new Functor2 + (Atom.a("existence_error"), Atom.a("procedure"), new Functor2(Atom.a("/"), predicateName, arity)), + message) + { + _predicateName = predicateName; + _arity = arity; + } + + public Atom PredicateName + { + get { return _predicateName; } + } + + public int Arity + { + get { return _arity; } + } + } +} diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/YieldProlog/Variable.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/YieldProlog/Variable.cs new file mode 100644 index 0000000..2b5b0f1 --- /dev/null +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/YieldProlog/Variable.cs @@ -0,0 +1,196 @@ +/* + * Copyright (C) 2007-2008, Jeff Thompson + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the copyright holder nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +using System; +using System.Collections; +using System.Collections.Generic; + +namespace OpenSim.Region.ScriptEngine.Shared.YieldProlog +{ + public interface IUnifiable + { + IEnumerable unify(object arg); + void addUniqueVariables(List variableSet); + object makeCopy(Variable.CopyStore copyStore); + bool termEqual(object term); + bool ground(); + } + + public class Variable : IUnifiable + { + // Use _isBound separate from _value so that it can be bound to any value, + // including null. + private bool _isBound = false; + private object _value; + + public object getValue() + { + if (!_isBound) + return this; + + object result = _value; + while (result is Variable) + { + if (!((Variable)result)._isBound) + return result; + + // Keep following the Variable chain. + result = ((Variable)result)._value; + } + + return result; + } + + public IEnumerable unify(object arg) + { + if (!_isBound) + { + _value = YP.getValue(arg); + if (_value == this) + // We are unifying this unbound variable with itself, so leave it unbound. + yield return false; + else + { + _isBound = true; + try + { + yield return false; + } + finally + { + // Remove the binding. + _isBound = false; + } + } + } + else + { + foreach (bool l1 in YP.unify(this, arg)) + yield return false; + } + } + + public override string ToString() + { + object value = getValue(); + if (value == this) + return "Variable"; + else + return getValue().ToString(); + } + + /// + /// If bound, call YP.addUniqueVariables on the value. Otherwise, if this unbound + /// variable is not already in variableSet, add it. + /// + /// + public void addUniqueVariables(List variableSet) + { + if (_isBound) + YP.addUniqueVariables(getValue(), variableSet); + else + { + if (variableSet.IndexOf(this) < 0) + variableSet.Add(this); + } + } + + /// + /// If bound, return YP.makeCopy for the value, else return copyStore.getCopy(this). + /// However, if copyStore is null, just return this. + /// + /// + /// + public object makeCopy(Variable.CopyStore copyStore) + { + if (_isBound) + return YP.makeCopy(getValue(), copyStore); + else + return copyStore == null ? this : copyStore.getCopy(this); + } + + public bool termEqual(object term) + { + if (_isBound) + return YP.termEqual(getValue(), term); + else + return this == YP.getValue(term); + } + + public bool ground() + { + if (_isBound) + // This is usually called by YP.ground which already did getValue, so this + // should never be reached, but check anyway. + return YP.ground(getValue()); + else + return false; + } + + /// + /// A CopyStore is used by makeCopy to track which Variable objects have + /// been copied. + /// + public class CopyStore + { + private List _inVariableSet = new List(); + private List _outVariableSet = new List(); + + /// + /// If inVariable has already been copied, return its copy. Otherwise, + /// return a fresh Variable associated with inVariable. + /// + /// + /// + public Variable getCopy(Variable inVariable) + { + int index = _inVariableSet.IndexOf(inVariable); + if (index >= 0) + return _outVariableSet[index]; + else + { + Variable outVariable = new Variable(); + _inVariableSet.Add(inVariable); + _outVariableSet.Add(outVariable); + return outVariable; + } + } + + /// + /// Return the number of unique variables that have been copied. + /// + /// + public int getNUniqueVariables() + { + return _inVariableSet.Count; + } + } + } +} diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/YieldProlog/YP.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/YieldProlog/YP.cs new file mode 100644 index 0000000..74704aa --- /dev/null +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/YieldProlog/YP.cs @@ -0,0 +1,1644 @@ +/* + * Copyright (C) 2007-2008, Jeff Thompson + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the copyright holder nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +using System; +using System.Collections; +using System.Collections.Generic; +using System.IO; +using System.Reflection; + +namespace OpenSim.Region.ScriptEngine.Shared.YieldProlog +{ + /// + /// YP has static methods for general functions in Yield Prolog such as + /// and . + /// + public class YP + { + private static Fail _fail = new Fail(); + private static Repeat _repeat = new Repeat(); + private static Dictionary> _predicatesStore = + new Dictionary>(); + private static TextWriter _outputStream = System.Console.Out; + private static TextReader _inputStream = System.Console.In; + private static List _operatorTable = null; + + /// + /// An IClause is used so that dynamic predicates can call match. + /// + public interface IClause + { + IEnumerable match(object[] args); + } + + public static object getValue(object value) + { + if (value is Variable) + return ((Variable)value).getValue(); + else + return value; + } + + public static IEnumerable unify(object arg1, object arg2) + { + arg1 = getValue(arg1); + arg2 = getValue(arg2); + if (arg1 is IUnifiable) + return ((IUnifiable)arg1).unify(arg2); + else if (arg2 is IUnifiable) + return ((IUnifiable)arg2).unify(arg1); + else + { + // Arguments are "normal" types. + if (arg1.Equals(arg2)) + return new Succeed(); + else + return _fail; + } + } + + /// + /// This is used for the lookup key in _factStore. + /// + public struct NameArity + { + public readonly Atom _name; + public readonly int _arity; + + public NameArity(Atom name, int arity) + { + _name = name; + _arity = arity; + } + + public override bool Equals(object obj) + { + if (obj is NameArity) + { + NameArity nameArity = (NameArity)obj; + return nameArity._name.Equals(_name) && nameArity._arity.Equals(_arity); + } + else + { + return false; + } + } + + public override int GetHashCode() + { + return _name.GetHashCode() ^ _arity.GetHashCode(); + } + } + + /// + /// Convert term to an int. + /// If term is a single-element List, use its first element + /// (to handle the char types like "a"). If can't convert, throw an exception. + /// + /// + /// + public static int convertInt(object term) + { + term = YP.getValue(term); + if (term is Functor2 && ((Functor2)term)._name == Atom.DOT && + YP.getValue(((Functor2)term)._arg2) == Atom.NIL) + // Assume it is a char type like "a". + term = YP.getValue(((Functor2)term)._arg1); + + return (int)term; + } + + /// + /// Convert term to a double. This may convert an int to a double, etc. + /// If term is a single-element List, use its first element + /// (to handle the char types like "a"). If can't convert, throw an exception. + /// + /// + /// + public static double convertDouble(object term) + { + term = YP.getValue(term); + if (term is Functor2 && ((Functor2)term)._name == Atom.DOT && + YP.getValue(((Functor2)term)._arg2) == Atom.NIL) + // Assume it is a char type like "a". + term = YP.getValue(((Functor2)term)._arg1); + if (term is Variable) + throw new PrologException(Atom.a("instantiation_error"), + "Expected a number but the argument is an unbound variable"); + + return Convert.ToDouble(term); + } + + /// + /// If term is an integer, set intTerm. + /// If term is a single-element List, use its first element + /// (to handle the char types like "a"). Return true for success, false if can't convert. + /// We use a success return value because throwing an exception is inefficient. + /// + /// + /// + public static bool getInt(object term, out int intTerm) + { + term = YP.getValue(term); + if (term is Functor2 && ((Functor2)term)._name == Atom.DOT && + YP.getValue(((Functor2)term)._arg2) == Atom.NIL) + // Assume it is a char type like "a". + term = YP.getValue(((Functor2)term)._arg1); + + if (term is int) + { + intTerm = (int)term; + return true; + } + + intTerm = 0; + return false; + } + + public static bool equal(object x, object y) + { + x = YP.getValue(x); + if (x is DateTime) + return (DateTime)x == (DateTime)YP.getValue(y); + // Assume convertDouble converts an int to a double perfectly. + return YP.convertDouble(x) == YP.convertDouble(y); + } + + public static bool notEqual(object x, object y) + { + x = YP.getValue(x); + if (x is DateTime) + return (DateTime)x != (DateTime)YP.getValue(y); + // Assume convertDouble converts an int to a double perfectly. + return YP.convertDouble(x) != YP.convertDouble(y); + } + + public static bool greaterThan(object x, object y) + { + x = YP.getValue(x); + if (x is DateTime) + return (DateTime)x > (DateTime)YP.getValue(y); + // Assume convertDouble converts an int to a double perfectly. + return YP.convertDouble(x) > YP.convertDouble(y); + } + + public static bool lessThan(object x, object y) + { + x = YP.getValue(x); + if (x is DateTime) + return (DateTime)x < (DateTime)YP.getValue(y); + // Assume convertDouble converts an int to a double perfectly. + return YP.convertDouble(x) < YP.convertDouble(y); + } + + public static bool greaterThanOrEqual(object x, object y) + { + x = YP.getValue(x); + if (x is DateTime) + return (DateTime)x >= (DateTime)YP.getValue(y); + // Assume convertDouble converts an int to a double perfectly. + return YP.convertDouble(x) >= YP.convertDouble(y); + } + + public static bool lessThanOrEqual(object x, object y) + { + x = YP.getValue(x); + if (x is DateTime) + return (DateTime)x <= (DateTime)YP.getValue(y); + // Assume convertDouble converts an int to a double perfectly. + return YP.convertDouble(x) <= YP.convertDouble(y); + } + + public static object negate(object x) + { + int intX; + if (getInt(x, out intX)) + return -intX; + return -convertDouble(x); + } + + public static object abs(object x) + { + int intX; + if (getInt(x, out intX)) + return Math.Abs(intX); + return Math.Abs(convertDouble(x)); + } + + public static object sign(object x) + { + int intX; + if (getInt(x, out intX)) + return Math.Sign(intX); + return Math.Sign(convertDouble(x)); + } + + /// + /// The ISO standard returns an int. + /// + /// + /// + public static object floor(object x) + { + return (int)Math.Floor(convertDouble(x)); + } + + /// + /// The ISO standard returns an int. + /// + /// + /// + public static object truncate(object x) + { + return (int)Math.Truncate(convertDouble(x)); + } + + /// + /// The ISO standard returns an int. + /// + /// + /// + public static object round(object x) + { + return (int)Math.Round(convertDouble(x)); + } + + /// + /// The ISO standard returns an int. + /// + /// + /// + public static object ceiling(object x) + { + return (int)Math.Ceiling(convertDouble(x)); + } + + public static object sin(object x) + { + return Math.Sin(YP.convertDouble(x)); + } + + public static object cos(object x) + { + return Math.Cos(YP.convertDouble(x)); + } + + public static object atan(object x) + { + return Math.Atan(YP.convertDouble(x)); + } + + public static object exp(object x) + { + return Math.Exp(YP.convertDouble(x)); + } + + public static object log(object x) + { + return Math.Log(YP.convertDouble(x)); + } + + public static object sqrt(object x) + { + return Math.Sqrt(convertDouble(x)); + } + + public static object bitwiseComplement(object x) + { + return ~YP.convertInt(x); + } + + public static object add(object x, object y) + { + int intX, intY; + if (getInt(x, out intX) && getInt(y, out intY)) + return intX + intY; + return convertDouble(x) + convertDouble(y); + } + + public static object subtract(object x, object y) + { + int intX, intY; + if (getInt(x, out intX) && getInt(y, out intY)) + return intX - intY; + return convertDouble(x) - convertDouble(y); + } + + public static object multiply(object x, object y) + { + int intX, intY; + if (getInt(x, out intX) && getInt(y, out intY)) + return intX * intY; + return convertDouble(x) * convertDouble(y); + } + + /// + /// Return floating point, even if both arguments are integer. + /// + /// + /// + /// + public static object divide(object x, object y) + { + return convertDouble(x) / convertDouble(y); + } + + public static object intDivide(object x, object y) + { + int intX, intY; + if (getInt(x, out intX) && getInt(y, out intY)) + return intX / intY; + // Still allow passing a double, but treat as an int. + return (int)convertDouble(x) / (int)convertDouble(y); + } + + public static object mod(object x, object y) + { + int intX, intY; + if (getInt(x, out intX) && getInt(y, out intY)) + return intX % intY; + // Still allow passing a double, but treat as an int. + return (int)convertDouble(x) % (int)convertDouble(y); + } + + public static object pow(object x, object y) + { + return Math.Pow(YP.convertDouble(x), YP.convertDouble(y)); + } + + public static object bitwiseShiftRight(object x, object y) + { + return YP.convertInt(x) >> YP.convertInt(y); + } + + public static object bitwiseShiftLeft(object x, object y) + { + return YP.convertInt(x) << YP.convertInt(y); + } + + public static object bitwiseAnd(object x, object y) + { + return YP.convertInt(x) & YP.convertInt(y); + } + + public static object bitwiseOr(object x, object y) + { + return YP.convertInt(x) | YP.convertInt(y); + } + + public static object min(object x, object y) + { + int intX, intY; + if (getInt(x, out intX) && getInt(y, out intY)) + return Math.Min(intX, intY); + return Math.Min(convertDouble(x), convertDouble(y)); + } + + public static object max(object x, object y) + { + int intX, intY; + if (getInt(x, out intX) && getInt(y, out intY)) + return Math.Max(intX, intY); + return Math.Max(convertDouble(x), convertDouble(y)); + } + + public static IEnumerable copy_term(object inTerm, object outTerm) + { + return YP.unify(outTerm, YP.makeCopy(inTerm, new Variable.CopyStore())); + } + + public static void addUniqueVariables(object term, List variableSet) + { + term = YP.getValue(term); + if (term is IUnifiable) + ((IUnifiable)term).addUniqueVariables(variableSet); + } + + public static object makeCopy(object term, Variable.CopyStore copyStore) + { + term = YP.getValue(term); + if (term is IUnifiable) + return ((IUnifiable)term).makeCopy(copyStore); + else + // term is a "normal" type. Assume it is ground. + return term; + } + + /// + /// Sort the array in place according to termLessThan. This does not remove duplicates + /// + /// + public static void sortArray(object[] array) + { + Array.Sort(array, YP.compareTerms); + } + + /// + /// Sort the array in place according to termLessThan. This does not remove duplicates + /// + /// + public static void sortArray(List array) + { + array.Sort(YP.compareTerms); + } + + /// + /// Sort List according to termLessThan, remove duplicates and unify with Sorted. + /// + /// + /// + /// + public static IEnumerable sort(object List, object Sorted) + { + object[] array = ListPair.toArray(List); + if (array == null) + return YP.fail(); + if (array.Length > 1) + sortArray(array); + return YP.unify(Sorted, ListPair.makeWithoutRepeatedTerms(array)); + } + + + + /// + /// Use YP.unify to unify each of the elements of the two arrays, and yield + /// once if they all unify. + /// + /// + /// + /// + public static IEnumerable unifyArrays(object[] array1, object[] array2) + { + if (array1.Length != array2.Length) + yield break; + + IEnumerator[] iterators = new IEnumerator[array1.Length]; + bool gotMatch = true; + int nIterators = 0; + // Try to bind all the arguments. + for (int i = 0; i < array1.Length; ++i) + { + IEnumerator iterator = YP.unify(array1[i], array2[i]).GetEnumerator(); + iterators[nIterators++] = iterator; + // MoveNext() is true if YP.unify succeeds. + if (!iterator.MoveNext()) + { + gotMatch = false; + break; + } + } + + try + { + if (gotMatch) + yield return false; + } + finally + { + // Manually finalize all the iterators. + for (int i = 0; i < nIterators; ++i) + iterators[i].Dispose(); + } + } + + /// + /// Return an iterator (which you can use in a for-in loop) which does + /// zero iterations. This returns a pre-existing iterator which is + /// more efficient than letting the compiler generate a new one. + /// + /// + public static IEnumerable fail() + { + return _fail; + } + + /// + /// Return an iterator (which you can use in a for-in loop) which does + /// one iteration. This returns a pre-existing iterator which is + /// more efficient than letting the compiler generate a new one. + /// + /// + public static IEnumerable succeed() + { + return new Succeed(); + } + + /// + /// Return an iterator (which you can use in a for-in loop) which repeats + /// indefinitely. This returns a pre-existing iterator which is + /// more efficient than letting the compiler generate a new one. + /// + /// + public static IEnumerable repeat() + { + return _repeat; + } + + public static IEnumerable univ(object Term, object List) + { + Term = YP.getValue(Term); + List = YP.getValue(List); + + if (nonvar(Term)) + return YP.unify(new ListPair + (getFunctorName(Term), ListPair.make(getFunctorArgs(Term))), List); + + Variable Name = new Variable(); + Variable ArgList = new Variable(); + foreach (bool l1 in new ListPair(Name, ArgList).unify(List)) + { + object[] args = ListPair.toArray(ArgList); + if (args == null) + throw new Exception("Expected a list. Got: " + ArgList.getValue()); + if (args.Length == 0) + // Return the Name, even if it is not an Atom. + return YP.unify(Term, Name); + if (!atom(Name)) + throw new Exception("Expected an atom. Got: " + Name.getValue()); + + return YP.unify(Term, Functor.make((Atom)YP.getValue(Name), args)); + } + + return YP.fail(); + } + + public static IEnumerable functor(object Term, object FunctorName, object Arity) + { + Term = YP.getValue(Term); + FunctorName = YP.getValue(FunctorName); + Arity = YP.getValue(Arity); + + if (!(Term is Variable)) + { + foreach (bool l1 in YP.unify(FunctorName, getFunctorName(Term))) + { + foreach (bool l2 in YP.unify(Arity, getFunctorArgs(Term).Length)) + yield return false; + } + } + else + throw new NotImplementedException("Debug: must finish functor/3"); + } + + public static IEnumerable arg(object ArgNumber, object Term, object Value) + { + if (YP.var(ArgNumber)) + throw new NotImplementedException("Debug: must finish arg/3"); + else + { + int argNumberInt = convertInt(ArgNumber); + if (argNumberInt < 0) + throw new Exception("ArgNumber must be non-negative"); + object[] termArgs = YP.getFunctorArgs(Term); + // Silently fail if argNumberInt is out of range. + if (argNumberInt >= 1 && argNumberInt <= termArgs.Length) + { + // The first ArgNumber is at 1, not 0. + foreach (bool l1 in YP.unify(Value, termArgs[argNumberInt - 1])) + yield return false; + } + } + } + + public static bool termEqual(object Term1, object Term2) + { + Term1 = YP.getValue(Term1); + if (Term1 is IUnifiable) + return ((IUnifiable)Term1).termEqual(Term2); + return Term1.Equals(YP.getValue(Term2)); + } + + public static bool termNotEqual(object Term1, object Term2) + { + return !termEqual(Term1, Term2); + } + + public static bool termLessThan(object Term1, object Term2) + { + Term1 = YP.getValue(Term1); + Term2 = YP.getValue(Term2); + int term1TypeCode = getTypeCode(Term1); + int term2TypeCode = getTypeCode(Term2); + if (term1TypeCode != term2TypeCode) + return term1TypeCode < term2TypeCode; + + // The terms are the same type code. + if (term1TypeCode == -2) + { + // Variable. + // We always check for equality first because we want to be sure + // that less than returns false if the terms are equal, in + // case that the less than check really behaves like less than or equal. + if ((Variable)Term1 != (Variable)Term2) + // The hash code should be unique to a Variable object. + return Term1.GetHashCode() < Term2.GetHashCode(); + return false; + } + if (term1TypeCode == 0) + return ((Atom)Term1)._name.CompareTo(((Atom)Term2)._name) < 0; + if (term1TypeCode == 1) + return ((Functor1)Term1).lessThan((Functor1)Term2); + if (term1TypeCode == 2) + return ((Functor2)Term1).lessThan((Functor2)Term2); + if (term1TypeCode == 3) + return ((Functor3)Term1).lessThan((Functor3)Term2); + if (term1TypeCode == 4) + return ((Functor)Term1).lessThan((Functor)Term2); + + // Type code is -1 for general objects. First compare their type names. + // Note that this puts Double before Int32 as required by ISO Prolog. + string term1TypeName = Term1.GetType().ToString(); + string term2TypeName = Term2.GetType().ToString(); + if (term1TypeName != term2TypeName) + return term1TypeName.CompareTo(term2TypeName) < 0; + + // The terms are the same type name. + if (Term1 is int) + return (int)Term1 < (int)Term2; + else if (Term1 is double) + return (double)Term1 < (double)Term2; + else if (Term1 is DateTime) + return (DateTime)Term1 < (DateTime)Term2; + else if (Term1 is String) + return ((String)Term1).CompareTo((String)Term2) < 0; + // Debug: Should we try arrays, etc.? + + if (!Term1.Equals(Term2)) + // Could be equal or greater than. + return Term1.GetHashCode() < Term2.GetHashCode(); + return false; + } + + /// + /// Type code is -2 if term is a Variable, 0 if it is an Atom, + /// 1 if it is a Functor1, 2 if it is a Functor2, 3 if it is a Functor3, + /// 4 if it is Functor. + /// Otherwise, type code is -1. + /// This does not call YP.getValue(term). + /// + /// + /// + private static int getTypeCode(object term) + { + if (term is Variable) + return -2; + else if (term is Atom) + return 0; + else if (term is Functor1) + return 1; + else if (term is Functor2) + return 2; + else if (term is Functor3) + return 3; + else if (term is Functor) + return 4; + else + return -1; + } + + public static bool termLessThanOrEqual(object Term1, object Term2) + { + if (YP.termEqual(Term1, Term2)) + return true; + return YP.termLessThan(Term1, Term2); + } + + public static bool termGreaterThan(object Term1, object Term2) + { + return !YP.termLessThanOrEqual(Term1, Term2); + } + + public static bool termGreaterThanOrEqual(object Term1, object Term2) + { + // termLessThan should ensure that it returns false if terms are equal, + // so that this would return true. + return !YP.termLessThan(Term1, Term2); + } + + public static int compareTerms(object Term1, object Term2) + { + if (YP.termEqual(Term1, Term2)) + return 0; + else if (YP.termLessThan(Term1, Term2)) + return -1; + else + return 1; + } + + public static bool ground(object Term) + { + Term = YP.getValue(Term); + if (Term is IUnifiable) + return ((IUnifiable)Term).ground(); + return true; + } + + public static IEnumerable current_op + (object Priority, object Specifier, object Operator) + { + if (_operatorTable == null) + { + // Initialize. + _operatorTable = new List(); + _operatorTable.Add(new object[] { 1200, Atom.a("xfx"), Atom.a(":-") }); + _operatorTable.Add(new object[] { 1200, Atom.a("xfx"), Atom.a("-->") }); + _operatorTable.Add(new object[] { 1200, Atom.a("fx"), Atom.a(":-") }); + _operatorTable.Add(new object[] { 1200, Atom.a("fx"), Atom.a("?-") }); + _operatorTable.Add(new object[] { 1100, Atom.a("xfy"), Atom.a(";") }); + _operatorTable.Add(new object[] { 1050, Atom.a("xfy"), Atom.a("->") }); + _operatorTable.Add(new object[] { 1000, Atom.a("xfy"), Atom.a(",") }); + _operatorTable.Add(new object[] { 900, Atom.a("fy"), Atom.a("\\+") }); + _operatorTable.Add(new object[] { 700, Atom.a("xfx"), Atom.a("=") }); + _operatorTable.Add(new object[] { 700, Atom.a("xfx"), Atom.a("\\=") }); + _operatorTable.Add(new object[] { 700, Atom.a("xfx"), Atom.a("==") }); + _operatorTable.Add(new object[] { 700, Atom.a("xfx"), Atom.a("\\==") }); + _operatorTable.Add(new object[] { 700, Atom.a("xfx"), Atom.a("@<") }); + _operatorTable.Add(new object[] { 700, Atom.a("xfx"), Atom.a("@=<") }); + _operatorTable.Add(new object[] { 700, Atom.a("xfx"), Atom.a("@>") }); + _operatorTable.Add(new object[] { 700, Atom.a("xfx"), Atom.a("@>=") }); + _operatorTable.Add(new object[] { 700, Atom.a("xfx"), Atom.a("=..") }); + _operatorTable.Add(new object[] { 700, Atom.a("xfx"), Atom.a("is") }); + _operatorTable.Add(new object[] { 700, Atom.a("xfx"), Atom.a("=:=") }); + _operatorTable.Add(new object[] { 700, Atom.a("xfx"), Atom.a("=\\=") }); + _operatorTable.Add(new object[] { 700, Atom.a("xfx"), Atom.a("<") }); + _operatorTable.Add(new object[] { 700, Atom.a("xfx"), Atom.a("=<") }); + _operatorTable.Add(new object[] { 700, Atom.a("xfx"), Atom.a(">") }); + _operatorTable.Add(new object[] { 700, Atom.a("xfx"), Atom.a(">=") }); + _operatorTable.Add(new object[] { 600, Atom.a("xfy"), Atom.a(":") }); + _operatorTable.Add(new object[] { 500, Atom.a("yfx"), Atom.a("+") }); + _operatorTable.Add(new object[] { 500, Atom.a("yfx"), Atom.a("-") }); + _operatorTable.Add(new object[] { 500, Atom.a("yfx"), Atom.a("/\\") }); + _operatorTable.Add(new object[] { 500, Atom.a("yfx"), Atom.a("\\/") }); + _operatorTable.Add(new object[] { 400, Atom.a("yfx"), Atom.a("*") }); + _operatorTable.Add(new object[] { 400, Atom.a("yfx"), Atom.a("/") }); + _operatorTable.Add(new object[] { 400, Atom.a("yfx"), Atom.a("//") }); + _operatorTable.Add(new object[] { 400, Atom.a("yfx"), Atom.a("rem") }); + _operatorTable.Add(new object[] { 400, Atom.a("yfx"), Atom.a("mod") }); + _operatorTable.Add(new object[] { 400, Atom.a("yfx"), Atom.a("<<") }); + _operatorTable.Add(new object[] { 400, Atom.a("yfx"), Atom.a(">>") }); + _operatorTable.Add(new object[] { 200, Atom.a("xfx"), Atom.a("**") }); + _operatorTable.Add(new object[] { 200, Atom.a("xfy"), Atom.a("^") }); + _operatorTable.Add(new object[] { 200, Atom.a("fy"), Atom.a("-") }); + _operatorTable.Add(new object[] { 200, Atom.a("fy"), Atom.a("\\") }); + // Debug: This is hacked in to run the Prolog test suite until we implement op/3. + _operatorTable.Add(new object[] { 20, Atom.a("xfx"), Atom.a("<--") }); + } + + object[] args = new object[] { Priority, Specifier, Operator }; + foreach (object[] answer in _operatorTable) + { + foreach (bool l1 in YP.unifyArrays(args, answer)) + yield return false; + } + } + + public static IEnumerable atom_length(object atom, object Length) + { + return YP.unify(Length, ((Atom)YP.getValue(atom))._name.Length); + } + + public static IEnumerable atom_concat(object Start, object End, object Whole) + { + // Debug: Should implement for var(Start) which is a kind of search. + // Debug: Should we try to preserve the _declaringClass? + return YP.unify(Whole, Atom.a(((Atom)YP.getValue(Start))._name + + ((Atom)YP.getValue(End))._name)); + } + + public static IEnumerable sub_atom + (object atom, object Before, object Length, object After, object Sub_atom) + { + // Debug: Should implement for var(atom) which is a kind of search. + // Debug: Should we try to preserve the _declaringClass? + Atom atomAtom = (Atom)YP.getValue(atom); + int beforeInt = YP.convertInt(Before); + int lengthInt = YP.convertInt(Length); + if (beforeInt < 0) + throw new Exception("Before must be non-negative"); + if (lengthInt < 0) + throw new Exception("Length must be non-negative"); + int afterInt = atomAtom._name.Length - (beforeInt + lengthInt); + if (afterInt >= 0) + { + foreach (bool l1 in YP.unify(After, afterInt)) + { + foreach (bool l2 in YP.unify + (Sub_atom, Atom.a(atomAtom._name.Substring(beforeInt, lengthInt)))) + yield return false; + } + } + } + + public static IEnumerable atom_codes(object atom, object List) + { + atom = YP.getValue(atom); + List = YP.getValue(List); + + if (nonvar(atom)) + { + string name = ((Atom)atom)._name; + object codeList = Atom.NIL; + // Start from the back to make the list. + for (int i = name.Length - 1; i >= 0; --i) + codeList = new ListPair((int)name[i], codeList); + return YP.unify(List, codeList); + } + { + object[] codeArray = ListPair.toArray(List); + char[] charArray = new char[codeArray.Length]; + for (int i = 0; i < codeArray.Length; ++i) + charArray[i] = (char)YP.convertInt(codeArray[i]); + return YP.unify(atom, Atom.a(new String(charArray))); + } + } + + public static IEnumerable number_codes(object number, object List) + { + number = YP.getValue(number); + List = YP.getValue(List); + + if (nonvar(number)) + { + string numberString = null; + // Try converting to an int first. + int intNumber; + if (YP.getInt(number, out intNumber)) + numberString = intNumber.ToString(); + else + numberString = YP.doubleToString(YP.convertDouble(number)); + + object codeList = Atom.NIL; + // Start from the back to make the list. + for (int i = numberString.Length - 1; i >= 0; --i) + codeList = new ListPair((int)numberString[i], codeList); + return YP.unify(List, codeList); + } + { + object[] codeArray = ListPair.toArray(List); + char[] charArray = new char[codeArray.Length]; + for (int i = 0; i < codeArray.Length; ++i) + charArray[i] = (char)YP.convertInt(codeArray[i]); + String numberString = new String(charArray); + // Debug: Is there a way in C# to ask if a string parses as int without throwing an exception? + try + { + // Try an int first. + return YP.unify(number, Convert.ToInt32(numberString)); + } + catch (FormatException) { } + return YP.unify(number, Convert.ToDouble(numberString)); + } + } + + /// + /// If term is an Atom or functor type, return its name. + /// Otherwise, return term. + /// + /// + /// + public static object getFunctorName(object term) + { + term = YP.getValue(term); + if (term is Functor1) + return ((Functor1)term)._name; + else if (term is Functor2) + return ((Functor2)term)._name; + else if (term is Functor3) + return ((Functor3)term)._name; + else if (term is Functor) + return ((Functor)term)._name; + else + return term; + } + + /// + /// If term is an Atom or functor type, return an array of its args. + /// Otherwise, return an empty array. + /// + /// + /// + public static object[] getFunctorArgs(object term) + { + term = YP.getValue(term); + if (term is Functor1) + { + Functor1 functor = (Functor1)term; + return new object[] { functor._arg1 }; + } + else if (term is Functor2) + { + Functor2 functor = (Functor2)term; + return new object[] { functor._arg1, functor._arg2 }; + } + else if (term is Functor3) + { + Functor3 functor = (Functor3)term; + return new object[] { functor._arg1, functor._arg2, functor._arg3 }; + } + else if (term is Functor) { + Functor functor = (Functor)term; + return functor._args; + } + else + return new object[0]; + } + + public static bool var(object Term) + { + return YP.getValue(Term) is Variable; + } + + public static bool nonvar(object Term) + { + return !YP.var(Term); + } + + public static bool atom(object Term) + { + return YP.getValue(Term) is Atom; + } + + public static bool integer(object Term) + { + // Debug: Should exhaustively check for all integer types. + return getValue(Term) is int; + } + + // Use isFloat instead of float because it is a reserved keyword. + public static bool isFloat(object Term) + { + // Debug: Should exhaustively check for all float types. + return getValue(Term) is double; + } + + public static bool number(object Term) + { + return YP.integer(Term) || YP.isFloat(Term); + } + + public static bool atomic(object Term) + { + return YP.atom(Term) || YP.number(Term); + } + + public static bool compound(object Term) + { + Term = getValue(Term); + return Term is Functor1 || Term is Functor2 || Term is Functor3 || Term is Functor; + } + + public static void see(object input) + { + input = YP.getValue(input); + if (input is TextReader) + { + _inputStream = (TextReader)input; + return; + } + else if (input is Atom) + { + _inputStream = new StreamReader(((Atom)input)._name); + return; + } + else if (input is String) + { + _inputStream = new StreamReader((String)input); + return; + } + else + throw new InvalidOperationException("Can't open stream for " + input); + } + + public static void seen() + { + if (_inputStream == Console.In) + return; + _inputStream.Close(); + _inputStream = Console.In; + } + + public static void tell(object output) + { + output = YP.getValue(output); + if (output is TextWriter) + { + _outputStream = (TextWriter)output; + return; + } + else if (output is Atom) + { + _outputStream = new StreamWriter(((Atom)output)._name); + return; + } + else if (output is String) + { + _outputStream = new StreamWriter((String)output); + return; + } + else + throw new InvalidOperationException("Can't open stream for " + output); + } + + public static void told() + { + if (_outputStream == Console.Out) + return; + _outputStream.Close(); + _outputStream = Console.Out; + } + + public static IEnumerable current_output(object Stream) + { + return YP.unify(Stream, _outputStream); + } + + public static void write(object x) + { + x = YP.getValue(x); + if (x is double) + _outputStream.Write(doubleToString((double)x)); + else + _outputStream.Write(x.ToString()); + } + + /// + /// Format x as a string, making sure that it will parse as an int later. I.e., for 1.0, don't just + /// use "1" which will parse as an int. + /// + /// + /// + private static string doubleToString(double x) + { + string xString = x.ToString(); + // Debug: Is there a way in C# to ask if a string parses as int without throwing an exception? + try + { + Convert.ToInt32(xString); + // The string will parse as an int, not a double, so re-format so that it does. + // Use float if possible, else exponential if it would be too big. + return x.ToString(x >= 100000.0 ? "E1" : "f1"); + } + catch (FormatException) + { + // Assume it will parse as a double. + } + return xString; + } + + public static void put_code(object x) + { + _outputStream.Write((char)YP.convertInt(x)); + } + + public static void nl() + { + _outputStream.WriteLine(); + } + + public static IEnumerable get_code(object code) + { + return YP.unify(code, _inputStream.Read()); + } + + public static void asserta(object Term, Type declaringClass) + { + assertDynamic(Term, declaringClass, true); + } + + public static void assertz(object Term, Type declaringClass) + { + assertDynamic(Term, declaringClass, false); + } + + public static void assertDynamic(object Term, Type declaringClass, bool prepend) + { + Term = getValue(Term); + if (Term is Variable) + throw new PrologException("instantiation_error", "Term to assert is an unbound variable"); + + Variable.CopyStore copyStore = new Variable.CopyStore(); + object TermCopy = makeCopy(Term, copyStore); + object Head, Body; + if (TermCopy is Functor2 && ((Functor2)TermCopy)._name == Atom.RULE) + { + Head = YP.getValue(((Functor2)TermCopy)._arg1); + Body = YP.getValue(((Functor2)TermCopy)._arg2); + } + else + { + Head = TermCopy; + Body = Atom.a("true"); + } + + Atom name = getFunctorName(Head) as Atom; + if (name == null) + // name is a non-Atom, such as a number. + throw new PrologException + (new Functor2("type_error", Atom.a("callable"), Head), "Term to assert is not callable"); + object[] args = getFunctorArgs(Head); + if (!isDynamic(name, args.Length)) + throw new PrologException + (new Functor3("permission_error", Atom.a("modify"), Atom.a("static_procedure"), + new Functor2(Atom.SLASH, name, args.Length)), + "Assert cannot modify static predicate " + name + "/" + args.Length); + + if (copyStore.getNUniqueVariables() == 0 && Body == Atom.a("true")) + { + // Debug: Until IndexedAnswers supports prepend, compile the fact so we can prepend it below. + if (!prepend) + { + // This is a fact with no unbound variables + // assertFact uses IndexedAnswers, so don't we don't need to compile. + assertFact(name, args); + return; + } + } + + IClause clause = YPCompiler.compileAnonymousClause(Head, Body, declaringClass); + + // Add the clause to the entry in _predicatesStore. + NameArity nameArity = new NameArity(name, args.Length); + List clauses; + if (!_predicatesStore.TryGetValue(nameArity, out clauses)) + // Create an entry for the nameArity. + _predicatesStore[nameArity] = (clauses = new List()); + + if (prepend) + clauses.Insert(0, clause); + else + clauses.Add(clause); + } + + private static bool isDynamic(Atom name, int arity) + { + if (arity == 2 && (name == Atom.a(",") || name == Atom.a(";") || name == Atom.DOT)) + return false; + // Use the same mapping to static predicates in YP as the compiler. + foreach (bool l1 in YPCompiler.functorCallYPFunctionName(name, arity, new Variable())) + return false; + // Debug: Do we need to check if name._module is null? + return true; + } + + /// + /// Assert values at the end of the set of facts for the predicate with the + /// name and with arity values.Length. + /// + /// must be an Atom + /// the array of arguments to the fact predicate. + /// It is an error if an value has an unbound variable. + public static void assertFact(Atom name, object[] values) + { + NameArity nameArity = new NameArity(name, values.Length); + List clauses; + IndexedAnswers indexedAnswers; + if (!_predicatesStore.TryGetValue(nameArity, out clauses)) + { + // Create an IndexedAnswers as the first clause of the predicate. + _predicatesStore[nameArity] = (clauses = new List()); + clauses.Add(indexedAnswers = new IndexedAnswers()); + } + else + { + indexedAnswers = clauses[clauses.Count - 1] as IndexedAnswers; + if (indexedAnswers == null) + // The latest clause is not an IndexedAnswers, so add one. + clauses.Add(indexedAnswers = new IndexedAnswers()); + } + + indexedAnswers.addAnswer(values); + } + + /// + /// Match all clauses of the dynamic predicate with the name and with arity + /// arguments.Length. + /// It is an error if the predicate is not defined. + /// + /// must be an Atom + /// an array of arity number of arguments + /// an iterator which you can use in foreach + public static IEnumerable matchDynamic(Atom name, object[] arguments) + { + List clauses; + if (!_predicatesStore.TryGetValue(new NameArity(name, arguments.Length), out clauses)) + throw new UndefinedPredicateException + ("Undefined fact: " + name + "/" + arguments.Length, name, + arguments.Length); + + if (clauses.Count == 1) + // Usually there is only one clause, so return it without needing to wrap it in an iterator. + return clauses[0].match(arguments); + else + return matchAllClauses(clauses, arguments); + } + + /// + /// Call match(arguments) for each IClause in clauses. We make this a separate + /// function so that matchDynamic itself does not need to be an iterator object. + /// + /// + /// + /// + private static IEnumerable matchAllClauses(List clauses, object[] arguments) + { + // Debug: If the clause asserts another clause into this same predicate, the iterator + // over clauses will be corrupted. Should we take the time to copy clauses? + foreach (IClause clause in clauses) + { + foreach (bool lastCall in clause.match(arguments)) + { + yield return false; + if (lastCall) + // This happens after a cut in a clause. + yield break; + } + } + } + + /// + /// This is deprecated and just calls matchDynamic. This matches all clauses, + /// not just the ones defined with assertFact. + /// + /// + /// + /// + public static IEnumerable matchFact(Atom name, object[] arguments) + { + return matchDynamic(name, arguments); + } + + /// + /// This actually searches all clauses, not just + /// the ones defined with assertFact, but we keep the name for + /// backwards compatibility. + /// + /// must be an Atom + /// an array of arity number of arguments + public static void retractFact(Atom name, object[] arguments) + { + NameArity nameArity = new NameArity(name, arguments.Length); + List clauses; + if (!_predicatesStore.TryGetValue(nameArity, out clauses)) + // Can't find, so ignore. + return; + + foreach (object arg in arguments) + { + if (!YP.var(arg)) + throw new InvalidOperationException("All arguments must be unbound"); + } + // Set to a fresh empty IndexedAnswers. + _predicatesStore[nameArity] = (clauses = new List()); + clauses.Add(new IndexedAnswers()); + } + + public static IEnumerable current_predicate(object NameSlashArity) + { + NameSlashArity = YP.getValue(NameSlashArity); + // First check if Name and Arity are nonvar so we can do a direct lookup. + if (YP.ground(NameSlashArity)) + { + if (NameSlashArity is Functor2) + { + Functor2 NameArityFunctor = (Functor2)NameSlashArity; + if (NameArityFunctor._name == Atom.SLASH) + { + if (_predicatesStore.ContainsKey(new NameArity + ((Atom)YP.getValue(NameArityFunctor._arg1), + (int)YP.getValue(NameArityFunctor._arg2)))) + // The predicate is defined. + yield return false; + } + } + yield break; + } + + foreach (NameArity key in _predicatesStore.Keys) + { + foreach (bool l1 in YP.unify + (new Functor2(Atom.SLASH, key._name, key._arity), NameSlashArity)) + yield return false; + } + } + + /// + /// Use YP.getFunctorName(Goal) and invoke the static method of this name in the + /// declaringClass, using arguments from YP.getFunctorArgs(Goal). + /// Note that Goal must be a simple functor, not a complex expression. + /// If not found, this throws UndefinedPredicateException. + /// + /// + /// the class for looking up default function references + /// + public static IEnumerable getIterator(object Goal, Type declaringClass) + { + Goal = YP.getValue(Goal); + if (Goal is Variable) + throw new PrologException("instantiation_error", "Goal to call is an unbound variable"); +#if true + List variableSetList = new List(); + addUniqueVariables(Goal, variableSetList); + Variable[] variableSet = variableSetList.ToArray(); + + // Use Atom.F since it is ignored. + return YPCompiler.compileAnonymousClause + (Functor.make(Atom.F, variableSet), Goal, declaringClass).match(variableSet); +#else + Atom name; + object[] args; + while (true) + { + name = (Atom)YP.getFunctorName(Goal); + args = YP.getFunctorArgs(Goal); + if (name == Atom.HAT && args.Length == 2) + // Assume this is called from a bagof operation. Skip the leading qualifiers. + Goal = YP.getValue(((Functor2)Goal)._arg2); + else + break; + } + try + { + return (IEnumerable)declaringClass.InvokeMember + (name._name, BindingFlags.InvokeMethod, null, null, args); + } + catch (TargetInvocationException exception) + { + throw exception.InnerException; + } + catch (MissingMethodException) + { + throw new UndefinedPredicateException + ("Cannot find predicate function: " + name + "/" + args.Length + " in " + + declaringClass.FullName, name, args.Length); + } +#endif + } + + public static void throwException(object Term) + { + throw new PrologException(Term); + } + + /// + /// script_event calls hosting script with events as a callback method. + /// + /// + /// + /// + public static void script_event(object script_event, object script_params) + { + string function = ((Atom)YP.getValue(script_event))._name; + object[] array = ListPair.toArray(script_params); + if (array == null) + return; // YP.fail(); + if (array.Length > 1) + { + //m_CmdManager.m_ScriptEngine.m_EventQueManager.AddToScriptQueue + //(localID, itemID, function, array); + // sortArray(array); + } + //return YP.unify(Sorted, ListPair.makeWithoutRepeatedTerms(array)); + } + + /// + /// An enumerator that does zero loops. + /// + private class Fail : IEnumerator, IEnumerable + { + public bool MoveNext() + { + return false; + } + + public IEnumerator GetEnumerator() + { + return (IEnumerator)this; + } + + IEnumerator IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + + public bool Current + { + get { return true; } + } + + object IEnumerator.Current + { + get { return true; } + } + + public void Dispose() + { + } + + public void Reset() + { + throw new NotImplementedException(); + } + } + + /// + /// An enumerator that does one iteration. + /// + private class Succeed : IEnumerator, IEnumerable + { + private bool _didIteration = false; + + public bool MoveNext() + { + if (!_didIteration) + { + _didIteration = true; + return true; + } + else + return false; + } + + public IEnumerator GetEnumerator() + { + return (IEnumerator)this; + } + + IEnumerator IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + + public bool Current + { + get { return false; } + } + + object IEnumerator.Current + { + get { return false; } + } + + public void Dispose() + { + } + + public void Reset() + { + throw new NotImplementedException(); + } + } + + /// + /// An enumerator that repeats forever. + /// + private class Repeat : IEnumerator, IEnumerable + { + public bool MoveNext() + { + return true; + } + + public IEnumerator GetEnumerator() + { + return (IEnumerator)this; + } + + IEnumerator IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + + public bool Current + { + get { return false; } + } + + object IEnumerator.Current + { + get { return false; } + } + + public void Dispose() + { + } + + public void Reset() + { + throw new NotImplementedException(); + } + } + + /// + /// An enumerator that wraps another enumerator in order to catch a PrologException. + /// + public class Catch : IEnumerator, IEnumerable + { + private IEnumerator _enumerator; + private PrologException _exception = null; + + public Catch(IEnumerable iterator) + { + _enumerator = iterator.GetEnumerator(); + } + + /// + /// Call _enumerator.MoveNext(). If it throws a PrologException, set _exception + /// and return false. After this returns false, call unifyExceptionOrThrow. + /// Assume that, after this returns false, it will not be called again. + /// + /// + public bool MoveNext() + { + try + { + return _enumerator.MoveNext(); + } + catch (PrologException exception) + { + _exception = exception; + return false; + } + } + + /// + /// Call this after MoveNext() returns false to check for an exception. If + /// MoveNext did not get a PrologException, don't yield. + /// Otherwise, unify the exception with Catcher and yield so the caller can + /// do the handler code. However, if can't unify with Catcher then throw the exception. + /// + /// + /// + public IEnumerable unifyExceptionOrThrow(object Catcher) + { + if (_exception != null) + { + bool didUnify = false; + foreach (bool l1 in YP.unify(_exception._term, Catcher)) + { + didUnify = true; + yield return false; + } + if (!didUnify) + throw _exception; + } + } + + public IEnumerator GetEnumerator() + { + return (IEnumerator)this; + } + + IEnumerator IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + + public bool Current + { + get { return _enumerator.Current; } + } + + object IEnumerator.Current + { + get { return _enumerator.Current; } + } + + public void Dispose() + { + _enumerator.Dispose(); + } + + public void Reset() + { + throw new NotImplementedException(); + } + } + } +} diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/YieldProlog/YPCompiler.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/YieldProlog/YPCompiler.cs new file mode 100644 index 0000000..f2f8145 --- /dev/null +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/YieldProlog/YPCompiler.cs @@ -0,0 +1,5651 @@ +/* + * Copyright (C) 2007-2008, Jeff Thompson + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the copyright holder nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +using System; +using System.IO; +using System.Collections; +using System.Collections.Generic; +using System.Text; +using System.CodeDom.Compiler; + +namespace OpenSim.Region.ScriptEngine.Shared.YieldProlog +{ + public class YPCompiler + { + private class CompilerState + { + public IndexedAnswers _pred = new IndexedAnswers(); + public Dictionary _moduleForNameArity = new Dictionary(); + public int _gensymCounter; + public bool _useFinalCutCode; + public Variable _finalCutCode; + public bool _codeUsesYield; + public Atom _determinism; + // a list of '='(Name, Variable) + public List _variableNames; + + // Make these static functions that explicitly take the State so Prolog can call it. + + /// + /// Make a new CompilerState and bind it to State. + /// + /// + /// + public static IEnumerable make(object State) + { + return YP.unify(State, new CompilerState()); + } + + public static void assertPred(object State, object Pred, object Determinism) + { + State = YP.getValue(State); + object functorName = YP.getFunctorName(Pred); + object[] functorArgs = YP.getFunctorArgs(Pred); + // Debug: Should check if it's already asserted and is the same. + ((CompilerState)State)._pred.addAnswer + (new object[] { functorName, functorArgs.Length, Pred, YP.getValue(Determinism) }); + } + + public static void assertModuleForNameArity(object State, object Name, object Arity, object Module) + { + State = YP.getValue(State); + Name = YP.getValue(Name); + Arity = YP.getValue(Arity); + Module = YP.getValue(Module); + // If the Module Atom comes from the parser, it always has null _declaringClass. + if (Module is Atom && ((Atom)Module)._module == null && Name is Atom && Arity is int) + { + // Replace a previous entry if it exists. + ((CompilerState)State)._moduleForNameArity[new YP.NameArity((Atom)Name, (int)Arity)] = + (Atom)Module; + } + } + + public static void startFunction(object State, object Head) + { + State = YP.getValue(State); + ((CompilerState)State)._gensymCounter = 0; + ((CompilerState)State)._useFinalCutCode = false; + ((CompilerState)State)._finalCutCode = new Variable(); + ((CompilerState)State)._codeUsesYield = false; + if (CompilerState.isDetNoneOut(State, Head)) + ((CompilerState)State)._determinism = Atom.a("detNoneOut"); + else if (CompilerState.isSemidetNoneOut(State, Head)) + ((CompilerState)State)._determinism = Atom.a("semidetNoneOut"); + else + ((CompilerState)State)._determinism = Atom.a("nondet"); + } + + public static void setCodeUsesYield(object State) + { + State = YP.getValue(State); + ((CompilerState)State)._codeUsesYield = true; + } + + public static bool codeUsesYield(object State) + { + State = YP.getValue(State); + return ((CompilerState)State)._codeUsesYield; + } + + public static bool determinismEquals(object State, object Term) + { + State = YP.getValue(State); + return YP.termEqual(((CompilerState)State)._determinism, Term); + } + + /// + /// Set _variableNames to a new list of (Name = Variable) for each unique variable in rule. + /// If the variable is in variableNameSuggestions, use it, otherwise use x1, x2, etc. + /// + /// + /// + /// + public static void newVariableNames(object State, object Rule, object VariableNameSuggestions) + { + State = YP.getValue(State); + List variablesSet = new List(); + YP.addUniqueVariables(Rule, variablesSet); + + ((CompilerState)State)._variableNames = new List(); + int xCounter = 0; + foreach (Variable variable in variablesSet) + ((CompilerState)State)._variableNames.Add + (new Functor2(Atom.a("="), makeVariableName(variable, VariableNameSuggestions, ++xCounter), + variable)); + } + + private static object makeVariableName(object variable, object variableNameSuggestions, int xCounter) + { + // Debug: should require named variables to start with _ or capital. Should + // check for duplicates and clashes with keywords. + for (object element = YP.getValue(variableNameSuggestions); + element is Functor2 && ((Functor2)element)._name == Atom.DOT; + element = YP.getValue(((Functor2)element)._arg2)) + { + object suggestionPair = YP.getValue(((Functor2)element)._arg1); + if (sameVariable(variable, ((Functor2)suggestionPair)._arg2)) + { + Atom suggestion = (Atom)YP.getValue(((Functor2)suggestionPair)._arg1); + if (suggestion.Equals(Atom.a("Atom"))) + suggestion = Atom.a("Atom_1"); + if (suggestion.Equals(Atom.a("Variable"))) + suggestion = Atom.a("Variable_1"); + if (suggestion.Equals(Atom.a("Functor"))) + suggestion = Atom.a("Functor_1"); + return suggestion; + } + } + + return Atom.a("x" + xCounter); + } + + /// + /// Unify Result with the name assigned by CompilerState.newVariableNames in State._variableNames + /// for variable. + /// + /// a Variable + /// + /// the assigned Name + public static IEnumerable getVariableName(object State, object variable, object Result) + { + State = YP.getValue(State); + foreach (object variableInfo in ((CompilerState)State)._variableNames) + { + if (variableInfo is Functor2 && ((Functor2)variableInfo)._name.Equals(Atom.a("="))) + { + if (sameVariable(variable, ((Functor2)variableInfo)._arg2)) + return YP.unify(Result, ((Functor2)variableInfo)._arg1); + } + } + + // We set up names for all unique variables, so this should never happen. + throw new PrologException(Atom.a("Can't find entry in _variableNames")); + } + + public static IEnumerable variableNamesList(object State, object VariableNamesList) + { + State = YP.getValue(State); + return YP.unify(VariableNamesList, ListPair.make(((CompilerState)State)._variableNames)); + } + + public static IEnumerable gensym(object State, object Base, object Symbol) + { + State = YP.getValue(State); + return YP.unify(Symbol, Atom.a(Base.ToString() + ++((CompilerState)State)._gensymCounter)); + } + + public static bool isDetNoneOut(object State, object Term) + { + State = YP.getValue(State); + object functorName = YP.getFunctorName(Term); + object[] functorArgs = YP.getFunctorArgs(Term); + + Variable pred = new Variable(); + foreach (bool l1 in ((CompilerState)State)._pred.match + (new object[] { functorName, functorArgs.Length, pred, Atom.a("det") })) + { + if (CompilerState.isNoneOut(YP.getFunctorArgs(pred.getValue()))) + { + return true; + } + } + + return false; + } + + public static bool isSemidetNoneOut(object State, object Term) + { + State = YP.getValue(State); + object functorName = YP.getFunctorName(Term); + object[] functorArgs = YP.getFunctorArgs(Term); + + Variable pred = new Variable(); + foreach (bool l1 in ((CompilerState)State)._pred.match + (new object[] { functorName, functorArgs.Length, pred, Atom.a("semidet") })) + { + if (CompilerState.isNoneOut(YP.getFunctorArgs(pred.getValue()))) + { + return true; + } + } + + return false; + } + + /// + /// Return false if any of args is out, otherwise true. + /// args is an array of ::(Type,Mode) where Mode is in or out. + /// + /// + /// + private static bool isNoneOut(object[] args) + { + foreach (object arg in args) + { + if (arg is Functor2 && ((Functor2)arg)._name == Atom.a("::") && + ((Functor2)arg)._arg2 == Atom.a("out")) + return false; + } + return true; + } + + public static bool nameArityHasModule(object State, object Name, object Arity, object Module) + { + State = YP.getValue(State); + Name = YP.getValue(Name); + Arity = YP.getValue(Arity); + Module = YP.getValue(Module); + if (Name is Atom && Arity is int) + { + Atom FoundModule; + if (!((CompilerState)State)._moduleForNameArity.TryGetValue + (new YP.NameArity((Atom)Name, (int)Arity), out FoundModule)) + return false; + return FoundModule == Module; + } + return false; + } + } + + /// + /// Use makeFunctionPseudoCode, convertFunctionCSharp and compileAnonymousFunction + /// to return an anonymous YP.IClause for the Head and Body of a rule clause. + /// + /// a prolog term such as new Functor2("test1", X, Y). + /// Note that the name of the head is ignored. + /// + /// a prolog term such as + /// new Functor2(",", new Functor1(Atom.a("test2", Atom.a("")), X), + /// new Functor2("=", Y, X)). + /// This may not be null. (For a head-only clause, set the Body to Atom.a("true"). + /// + /// if not null, the code is compiled as a subclass of this class + /// to resolve references to the default module Atom.a("") + /// a new YP.IClause object on which you can call match(object[] args) where + /// args length is the arity of the Head + public static YP.IClause compileAnonymousClause(object Head, object Body, Type declaringClass) + { + object[] args = YP.getFunctorArgs(Head); + // compileAnonymousFunction wants "function". + object Rule = new Functor2(Atom.RULE, Functor.make("function", args), Body); + object RuleList = ListPair.make(new Functor2(Atom.F, Rule, Atom.NIL)); + + StringWriter functionCode = new StringWriter(); + Variable SaveOutputStream = new Variable(); + foreach (bool l1 in YP.current_output(SaveOutputStream)) + { + try + { + YP.tell(functionCode); + Variable FunctionCode = new Variable(); + foreach (bool l2 in makeFunctionPseudoCode(RuleList, FunctionCode)) + { + if (YP.termEqual(FunctionCode, Atom.a("getDeclaringClass"))) + // Ignore getDeclaringClass since we have access to the one passed in. + continue; + + // Debug: should check if FunctionCode is a single call. + convertFunctionCSharp(FunctionCode); + } + YP.told(); + } + finally + { + // Restore after calling tell. + YP.tell(SaveOutputStream.getValue()); + } + } + return YPCompiler.compileAnonymousFunction + (functionCode.ToString(), args.Length, declaringClass); + } + + /// + /// Use CodeDomProvider to compile the functionCode and return a YP.IClause. + /// The function name must be "function" and have nArgs arguments. + /// + /// the code for the iterator, such as + /// "public static IEnumerable function() { yield return false; }" + /// + /// the number of args in the function + /// if not null, then use the functionCode inside a class which + /// inherits from contextClass, so that references in functionCode to methods in declaringClass don't + /// have to be qualified + /// a new YP.IClause object on which you can call match(object[] args) where + /// args length is nArgs + public static YP.IClause compileAnonymousFunction(string functionCode, int nArgs, Type declaringClass) + { + CompilerParameters parameters = new CompilerParameters(); + // This gets the location of the System assembly. + parameters.ReferencedAssemblies.Add(typeof(System.Int32).Assembly.Location); + // This gets the location of this assembly which also has YieldProlog.YP, etc. + parameters.ReferencedAssemblies.Add(typeof(YPCompiler).Assembly.Location); + if (declaringClass != null) + parameters.ReferencedAssemblies.Add(declaringClass.Assembly.Location); + parameters.GenerateInMemory = true; + + StringBuilder sourceCode = new StringBuilder(); + sourceCode.Append(@" +using System; +using System.Collections.Generic; +using YieldProlog; + +namespace Temporary { + public class Temporary : YP.IClause { + public class Inner" + (declaringClass == null ? "" : " : " + declaringClass.FullName) + @" { +"); + sourceCode.Append(functionCode); + // Basically, match applies the args to function. + sourceCode.Append(@" + } + public IEnumerable match(object[] args) { + return Inner.function("); + if (nArgs >= 1) + sourceCode.Append("args[0]"); + for (int i = 1; i < nArgs; ++i) + sourceCode.Append(", args[" + i + "]"); + sourceCode.Append(@"); + } + } +} +"); + + CompilerResults results = CodeDomProvider.CreateProvider + ("CSharp").CompileAssemblyFromSource(parameters, sourceCode.ToString()); + if (results.Errors.Count > 0) + throw new Exception("Error evaluating code: " + results.Errors[0]); + + // Return a new Temporary.Temporary object. + return (YP.IClause)results.CompiledAssembly.GetType + ("Temporary.Temporary").GetConstructor(Type.EmptyTypes).Invoke(null); + } + + // Compiler output follows. + + public class YPInnerClass { } + public static System.Type getDeclaringClass() { return typeof(YPInnerClass).DeclaringType; } + + public static void repeatWrite(object arg1, object N) + { + { + object _Value = arg1; + if (YP.termEqual(N, 0)) + { + return; + } + } + { + object Value = arg1; + Variable NextN = new Variable(); + YP.write(Value); + foreach (bool l2 in YP.unify(NextN, YP.subtract(N, 1))) + { + repeatWrite(Value, NextN); + return; + } + } + } + + public static bool sameVariable(object Variable1, object Variable2) + { + { + if (YP.var(Variable1)) + { + if (YP.var(Variable2)) + { + if (YP.termEqual(Variable1, Variable2)) + { + return true; + } + } + } + } + return false; + } + + public static IEnumerable makeFunctionPseudoCode(object RuleList, object FunctionCode) + { + { + Variable State = new Variable(); + foreach (bool l2 in CompilerState.make(State)) + { + CompilerState.assertPred(State, Atom.a(@"nl"), Atom.a(@"det")); + CompilerState.assertPred(State, new Functor1(@"write", new Functor2(@"::", Atom.a(@"univ"), Atom.a(@"in"))), Atom.a(@"det")); + CompilerState.assertPred(State, new Functor1(@"put_code", new Functor2(@"::", Atom.a(@"univ"), Atom.a(@"in"))), Atom.a(@"det")); + CompilerState.assertPred(State, new Functor1(@"throw", new Functor2(@"::", Atom.a(@"univ"), Atom.a(@"in"))), Atom.a(@"det")); + CompilerState.assertPred(State, new Functor1(@"var", new Functor2(@"::", Atom.a(@"univ"), Atom.a(@"in"))), Atom.a(@"semidet")); + CompilerState.assertPred(State, new Functor1(@"nonvar", new Functor2(@"::", Atom.a(@"univ"), Atom.a(@"in"))), Atom.a(@"semidet")); + CompilerState.assertPred(State, new Functor1(@"atom", new Functor2(@"::", Atom.a(@"univ"), Atom.a(@"in"))), Atom.a(@"semidet")); + CompilerState.assertPred(State, new Functor1(@"integer", new Functor2(@"::", Atom.a(@"univ"), Atom.a(@"in"))), Atom.a(@"semidet")); + CompilerState.assertPred(State, new Functor1(@"float", new Functor2(@"::", Atom.a(@"univ"), Atom.a(@"in"))), Atom.a(@"semidet")); + CompilerState.assertPred(State, new Functor1(@"number", new Functor2(@"::", Atom.a(@"univ"), Atom.a(@"in"))), Atom.a(@"semidet")); + CompilerState.assertPred(State, new Functor1(@"atomic", new Functor2(@"::", Atom.a(@"univ"), Atom.a(@"in"))), Atom.a(@"semidet")); + CompilerState.assertPred(State, new Functor1(@"compound", new Functor2(@"::", Atom.a(@"univ"), Atom.a(@"in"))), Atom.a(@"semidet")); + CompilerState.assertPred(State, new Functor2(@"==", new Functor2(@"::", Atom.a(@"univ"), Atom.a(@"in")), new Functor2(@"::", Atom.a(@"univ"), Atom.a(@"in"))), Atom.a(@"semidet")); + CompilerState.assertPred(State, new Functor2(@"\==", new Functor2(@"::", Atom.a(@"univ"), Atom.a(@"in")), new Functor2(@"::", Atom.a(@"univ"), Atom.a(@"in"))), Atom.a(@"semidet")); + CompilerState.assertPred(State, new Functor2(@"@<", new Functor2(@"::", Atom.a(@"univ"), Atom.a(@"in")), new Functor2(@"::", Atom.a(@"univ"), Atom.a(@"in"))), Atom.a(@"semidet")); + CompilerState.assertPred(State, new Functor2(@"@=<", new Functor2(@"::", Atom.a(@"univ"), Atom.a(@"in")), new Functor2(@"::", Atom.a(@"univ"), Atom.a(@"in"))), Atom.a(@"semidet")); + CompilerState.assertPred(State, new Functor2(@"@>", new Functor2(@"::", Atom.a(@"univ"), Atom.a(@"in")), new Functor2(@"::", Atom.a(@"univ"), Atom.a(@"in"))), Atom.a(@"semidet")); + CompilerState.assertPred(State, new Functor2(@"@>=", new Functor2(@"::", Atom.a(@"univ"), Atom.a(@"in")), new Functor2(@"::", Atom.a(@"univ"), Atom.a(@"in"))), Atom.a(@"semidet")); + processCompilerDirectives(RuleList, State); + foreach (bool l3 in YP.unify(FunctionCode, Atom.a(@"getDeclaringClass"))) + { + yield return false; + } + foreach (bool l3 in makeFunctionPseudoCode3(RuleList, State, FunctionCode)) + { + yield return false; + } + } + } + } + + public static void processCompilerDirectives(object arg1, object arg2) + { + { + object _State = arg2; + foreach (bool l2 in YP.unify(arg1, Atom.NIL)) + { + return; + } + } + { + object State = arg2; + Variable Pred = new Variable(); + Variable Determinism = new Variable(); + Variable x3 = new Variable(); + Variable RestRules = new Variable(); + foreach (bool l2 in YP.unify(arg1, new ListPair(new Functor2(@"f", new Functor1(@":-", new Functor1(@"pred", new Functor2(@"is", Pred, Determinism))), x3), RestRules))) + { + CompilerState.assertPred(State, Pred, Determinism); + processCompilerDirectives(RestRules, State); + return; + } + } + { + object State = arg2; + Variable Module = new Variable(); + Variable PredicateList = new Variable(); + Variable x3 = new Variable(); + Variable RestRules = new Variable(); + foreach (bool l2 in YP.unify(arg1, new ListPair(new Functor2(@"f", new Functor1(@":-", new Functor2(@"import", Module, PredicateList)), x3), RestRules))) + { + foreach (bool l3 in importPredicateList(State, Module, PredicateList)) + { + processCompilerDirectives(RestRules, State); + return; + } + } + } + { + object State = arg2; + Variable x1 = new Variable(); + Variable x2 = new Variable(); + Variable RestRules = new Variable(); + foreach (bool l2 in YP.unify(arg1, new ListPair(new Functor2(@"f", new Functor1(@":-", x1), x2), RestRules))) + { + processCompilerDirectives(RestRules, State); + return; + } + } + { + object State = arg2; + Variable Head = new Variable(); + Variable _Body = new Variable(); + Variable x3 = new Variable(); + Variable RestRules = new Variable(); + Variable Name = new Variable(); + Variable Arity = new Variable(); + foreach (bool l2 in YP.unify(arg1, new ListPair(new Functor2(@"f", new Functor2(@":-", Head, _Body), x3), RestRules))) + { + foreach (bool l3 in YP.functor(Head, Name, Arity)) + { + CompilerState.assertModuleForNameArity(State, Name, Arity, Atom.a(@"")); + processCompilerDirectives(RestRules, State); + return; + } + } + } + { + object State = arg2; + Variable Fact = new Variable(); + Variable x2 = new Variable(); + Variable RestRules = new Variable(); + Variable Name = new Variable(); + Variable Arity = new Variable(); + foreach (bool l2 in YP.unify(arg1, new ListPair(new Functor2(@"f", Fact, x2), RestRules))) + { + foreach (bool l3 in YP.functor(Fact, Name, Arity)) + { + CompilerState.assertModuleForNameArity(State, Name, Arity, Atom.a(@"")); + processCompilerDirectives(RestRules, State); + return; + } + } + } + { + object State = arg2; + Variable x1 = new Variable(); + Variable RestRules = new Variable(); + foreach (bool l2 in YP.unify(arg1, new ListPair(x1, RestRules))) + { + processCompilerDirectives(RestRules, State); + return; + } + } + } + + public static IEnumerable importPredicateList(object arg1, object arg2, object arg3) + { + { + object _State = arg1; + object _Module = arg2; + foreach (bool l2 in YP.unify(arg3, Atom.NIL)) + { + yield return true; + yield break; + } + } + { + object State = arg1; + object Module = arg2; + Variable Name = new Variable(); + Variable Arity = new Variable(); + Variable Rest = new Variable(); + foreach (bool l2 in YP.unify(arg3, new ListPair(new Functor2(@"/", Name, Arity), Rest))) + { + CompilerState.assertModuleForNameArity(State, Name, Arity, Module); + foreach (bool l3 in importPredicateList(State, Module, Rest)) + { + yield return true; + yield break; + } + } + } + { + object State = arg1; + object Module = arg2; + Variable x3 = new Variable(); + Variable Rest = new Variable(); + foreach (bool l2 in YP.unify(arg3, new ListPair(x3, Rest))) + { + foreach (bool l3 in importPredicateList(State, Module, Rest)) + { + yield return true; + yield break; + } + } + } + } + + public static IEnumerable makeFunctionPseudoCode3(object RuleList, object State, object FunctionCode) + { + { + Variable SamePredicateRuleList = new Variable(); + Variable RestRules = new Variable(); + foreach (bool l2 in samePredicateRuleList(RuleList, SamePredicateRuleList, RestRules)) + { + if (YP.termNotEqual(SamePredicateRuleList, Atom.NIL)) + { + foreach (bool l4 in compileSamePredicateFunction(SamePredicateRuleList, State, FunctionCode)) + { + yield return false; + } + foreach (bool l4 in makeFunctionPseudoCode3(RestRules, State, FunctionCode)) + { + yield return false; + } + } + } + } + } + + public static IEnumerable compileSamePredicateFunction(object SamePredicateRuleList, object State, object FunctionCode) + { + { + Variable FirstRule = new Variable(); + Variable x5 = new Variable(); + Variable x6 = new Variable(); + Variable x7 = new Variable(); + Variable Head = new Variable(); + Variable x9 = new Variable(); + Variable ArgAssignments = new Variable(); + Variable Calls = new Variable(); + Variable Rule = new Variable(); + Variable VariableNameSuggestions = new Variable(); + Variable ClauseBag = new Variable(); + Variable Name = new Variable(); + Variable ArgsList = new Variable(); + Variable FunctionArgNames = new Variable(); + Variable MergedArgName = new Variable(); + Variable ArgName = new Variable(); + Variable MergedArgNames = new Variable(); + Variable FunctionArgs = new Variable(); + Variable BodyCode = new Variable(); + Variable ReturnType = new Variable(); + Variable BodyWithReturn = new Variable(); + foreach (bool l2 in YP.unify(new ListPair(new Functor2(@"f", FirstRule, x5), x6), SamePredicateRuleList)) + { + foreach (bool l3 in YP.unify(FirstRule, new Functor1(@":-", x7))) + { + goto cutIf1; + } + foreach (bool l3 in YP.unify(new Functor2(@":-", Head, x9), FirstRule)) + { + CompilerState.startFunction(State, Head); + FindallAnswers findallAnswers3 = new FindallAnswers(new Functor2(@"f", ArgAssignments, Calls)); + foreach (bool l4 in member(new Functor2(@"f", Rule, VariableNameSuggestions), SamePredicateRuleList)) + { + foreach (bool l5 in compileBodyWithHeadBindings(Rule, VariableNameSuggestions, State, ArgAssignments, Calls)) + { + findallAnswers3.add(); + } + } + foreach (bool l4 in findallAnswers3.result(ClauseBag)) + { + foreach (bool l5 in YP.univ(Head, new ListPair(Name, ArgsList))) + { + foreach (bool l6 in getFunctionArgNames(ArgsList, 1, FunctionArgNames)) + { + FindallAnswers findallAnswers4 = new FindallAnswers(MergedArgName); + foreach (bool l7 in member(ArgName, FunctionArgNames)) + { + foreach (bool l8 in argAssignedAll(ArgName, ClauseBag, MergedArgName)) + { + findallAnswers4.add(); + goto cutIf5; + } + foreach (bool l8 in YP.unify(MergedArgName, ArgName)) + { + findallAnswers4.add(); + } + cutIf5: + { } + } + foreach (bool l7 in findallAnswers4.result(MergedArgNames)) + { + foreach (bool l8 in maplist_arg(MergedArgNames, FunctionArgs)) + { + foreach (bool l9 in maplist_compileClause(ClauseBag, MergedArgNames, BodyCode)) + { + if (CompilerState.determinismEquals(State, Atom.a(@"detNoneOut"))) + { + foreach (bool l11 in YP.unify(ReturnType, Atom.a(@"void"))) + { + if (CompilerState.determinismEquals(State, Atom.a(@"semidetNoneOut"))) + { + foreach (bool l13 in append(BodyCode, new ListPair(Atom.a(@"returnfalse"), Atom.NIL), BodyWithReturn)) + { + foreach (bool l14 in YP.unify(FunctionCode, new Functor(@"function", new object[] { ReturnType, Name, FunctionArgs, BodyWithReturn }))) + { + yield return false; + } + } + goto cutIf7; + } + if (CompilerState.determinismEquals(State, Atom.a(@"detNoneOut"))) + { + foreach (bool l13 in YP.unify(BodyWithReturn, BodyCode)) + { + foreach (bool l14 in YP.unify(FunctionCode, new Functor(@"function", new object[] { ReturnType, Name, FunctionArgs, BodyWithReturn }))) + { + yield return false; + } + } + goto cutIf8; + } + if (CompilerState.codeUsesYield(State)) + { + foreach (bool l13 in YP.unify(BodyWithReturn, BodyCode)) + { + foreach (bool l14 in YP.unify(FunctionCode, new Functor(@"function", new object[] { ReturnType, Name, FunctionArgs, BodyWithReturn }))) + { + yield return false; + } + } + goto cutIf9; + } + foreach (bool l12 in append(BodyCode, new ListPair(new Functor2(@"foreach", new Functor2(@"call", Atom.a(@"YP.fail"), Atom.NIL), new ListPair(Atom.a(@"yieldfalse"), Atom.NIL)), Atom.NIL), BodyWithReturn)) + { + foreach (bool l13 in YP.unify(FunctionCode, new Functor(@"function", new object[] { ReturnType, Name, FunctionArgs, BodyWithReturn }))) + { + yield return false; + } + } + cutIf9: + cutIf8: + cutIf7: + { } + } + goto cutIf6; + } + if (CompilerState.determinismEquals(State, Atom.a(@"semidetNoneOut"))) + { + foreach (bool l11 in YP.unify(ReturnType, Atom.a(@"bool"))) + { + if (CompilerState.determinismEquals(State, Atom.a(@"semidetNoneOut"))) + { + foreach (bool l13 in append(BodyCode, new ListPair(Atom.a(@"returnfalse"), Atom.NIL), BodyWithReturn)) + { + foreach (bool l14 in YP.unify(FunctionCode, new Functor(@"function", new object[] { ReturnType, Name, FunctionArgs, BodyWithReturn }))) + { + yield return false; + } + } + goto cutIf11; + } + if (CompilerState.determinismEquals(State, Atom.a(@"detNoneOut"))) + { + foreach (bool l13 in YP.unify(BodyWithReturn, BodyCode)) + { + foreach (bool l14 in YP.unify(FunctionCode, new Functor(@"function", new object[] { ReturnType, Name, FunctionArgs, BodyWithReturn }))) + { + yield return false; + } + } + goto cutIf12; + } + if (CompilerState.codeUsesYield(State)) + { + foreach (bool l13 in YP.unify(BodyWithReturn, BodyCode)) + { + foreach (bool l14 in YP.unify(FunctionCode, new Functor(@"function", new object[] { ReturnType, Name, FunctionArgs, BodyWithReturn }))) + { + yield return false; + } + } + goto cutIf13; + } + foreach (bool l12 in append(BodyCode, new ListPair(new Functor2(@"foreach", new Functor2(@"call", Atom.a(@"YP.fail"), Atom.NIL), new ListPair(Atom.a(@"yieldfalse"), Atom.NIL)), Atom.NIL), BodyWithReturn)) + { + foreach (bool l13 in YP.unify(FunctionCode, new Functor(@"function", new object[] { ReturnType, Name, FunctionArgs, BodyWithReturn }))) + { + yield return false; + } + } + cutIf13: + cutIf12: + cutIf11: + { } + } + goto cutIf10; + } + foreach (bool l10 in YP.unify(ReturnType, Atom.a(@"IEnumerable"))) + { + if (CompilerState.determinismEquals(State, Atom.a(@"semidetNoneOut"))) + { + foreach (bool l12 in append(BodyCode, new ListPair(Atom.a(@"returnfalse"), Atom.NIL), BodyWithReturn)) + { + foreach (bool l13 in YP.unify(FunctionCode, new Functor(@"function", new object[] { ReturnType, Name, FunctionArgs, BodyWithReturn }))) + { + yield return false; + } + } + goto cutIf14; + } + if (CompilerState.determinismEquals(State, Atom.a(@"detNoneOut"))) + { + foreach (bool l12 in YP.unify(BodyWithReturn, BodyCode)) + { + foreach (bool l13 in YP.unify(FunctionCode, new Functor(@"function", new object[] { ReturnType, Name, FunctionArgs, BodyWithReturn }))) + { + yield return false; + } + } + goto cutIf15; + } + if (CompilerState.codeUsesYield(State)) + { + foreach (bool l12 in YP.unify(BodyWithReturn, BodyCode)) + { + foreach (bool l13 in YP.unify(FunctionCode, new Functor(@"function", new object[] { ReturnType, Name, FunctionArgs, BodyWithReturn }))) + { + yield return false; + } + } + goto cutIf16; + } + foreach (bool l11 in append(BodyCode, new ListPair(new Functor2(@"foreach", new Functor2(@"call", Atom.a(@"YP.fail"), Atom.NIL), new ListPair(Atom.a(@"yieldfalse"), Atom.NIL)), Atom.NIL), BodyWithReturn)) + { + foreach (bool l12 in YP.unify(FunctionCode, new Functor(@"function", new object[] { ReturnType, Name, FunctionArgs, BodyWithReturn }))) + { + yield return false; + } + } + cutIf16: + cutIf15: + cutIf14: + { } + } + cutIf10: + cutIf6: + { } + } + } + } + } + } + } + goto cutIf2; + } + foreach (bool l3 in YP.unify(Head, FirstRule)) + { + CompilerState.startFunction(State, Head); + FindallAnswers findallAnswers17 = new FindallAnswers(new Functor2(@"f", ArgAssignments, Calls)); + foreach (bool l4 in member(new Functor2(@"f", Rule, VariableNameSuggestions), SamePredicateRuleList)) + { + foreach (bool l5 in compileBodyWithHeadBindings(Rule, VariableNameSuggestions, State, ArgAssignments, Calls)) + { + findallAnswers17.add(); + } + } + foreach (bool l4 in findallAnswers17.result(ClauseBag)) + { + foreach (bool l5 in YP.univ(Head, new ListPair(Name, ArgsList))) + { + foreach (bool l6 in getFunctionArgNames(ArgsList, 1, FunctionArgNames)) + { + FindallAnswers findallAnswers18 = new FindallAnswers(MergedArgName); + foreach (bool l7 in member(ArgName, FunctionArgNames)) + { + foreach (bool l8 in argAssignedAll(ArgName, ClauseBag, MergedArgName)) + { + findallAnswers18.add(); + goto cutIf19; + } + foreach (bool l8 in YP.unify(MergedArgName, ArgName)) + { + findallAnswers18.add(); + } + cutIf19: + { } + } + foreach (bool l7 in findallAnswers18.result(MergedArgNames)) + { + foreach (bool l8 in maplist_arg(MergedArgNames, FunctionArgs)) + { + foreach (bool l9 in maplist_compileClause(ClauseBag, MergedArgNames, BodyCode)) + { + if (CompilerState.determinismEquals(State, Atom.a(@"detNoneOut"))) + { + foreach (bool l11 in YP.unify(ReturnType, Atom.a(@"void"))) + { + if (CompilerState.determinismEquals(State, Atom.a(@"semidetNoneOut"))) + { + foreach (bool l13 in append(BodyCode, new ListPair(Atom.a(@"returnfalse"), Atom.NIL), BodyWithReturn)) + { + foreach (bool l14 in YP.unify(FunctionCode, new Functor(@"function", new object[] { ReturnType, Name, FunctionArgs, BodyWithReturn }))) + { + yield return false; + } + } + goto cutIf21; + } + if (CompilerState.determinismEquals(State, Atom.a(@"detNoneOut"))) + { + foreach (bool l13 in YP.unify(BodyWithReturn, BodyCode)) + { + foreach (bool l14 in YP.unify(FunctionCode, new Functor(@"function", new object[] { ReturnType, Name, FunctionArgs, BodyWithReturn }))) + { + yield return false; + } + } + goto cutIf22; + } + if (CompilerState.codeUsesYield(State)) + { + foreach (bool l13 in YP.unify(BodyWithReturn, BodyCode)) + { + foreach (bool l14 in YP.unify(FunctionCode, new Functor(@"function", new object[] { ReturnType, Name, FunctionArgs, BodyWithReturn }))) + { + yield return false; + } + } + goto cutIf23; + } + foreach (bool l12 in append(BodyCode, new ListPair(new Functor2(@"foreach", new Functor2(@"call", Atom.a(@"YP.fail"), Atom.NIL), new ListPair(Atom.a(@"yieldfalse"), Atom.NIL)), Atom.NIL), BodyWithReturn)) + { + foreach (bool l13 in YP.unify(FunctionCode, new Functor(@"function", new object[] { ReturnType, Name, FunctionArgs, BodyWithReturn }))) + { + yield return false; + } + } + cutIf23: + cutIf22: + cutIf21: + { } + } + goto cutIf20; + } + if (CompilerState.determinismEquals(State, Atom.a(@"semidetNoneOut"))) + { + foreach (bool l11 in YP.unify(ReturnType, Atom.a(@"bool"))) + { + if (CompilerState.determinismEquals(State, Atom.a(@"semidetNoneOut"))) + { + foreach (bool l13 in append(BodyCode, new ListPair(Atom.a(@"returnfalse"), Atom.NIL), BodyWithReturn)) + { + foreach (bool l14 in YP.unify(FunctionCode, new Functor(@"function", new object[] { ReturnType, Name, FunctionArgs, BodyWithReturn }))) + { + yield return false; + } + } + goto cutIf25; + } + if (CompilerState.determinismEquals(State, Atom.a(@"detNoneOut"))) + { + foreach (bool l13 in YP.unify(BodyWithReturn, BodyCode)) + { + foreach (bool l14 in YP.unify(FunctionCode, new Functor(@"function", new object[] { ReturnType, Name, FunctionArgs, BodyWithReturn }))) + { + yield return false; + } + } + goto cutIf26; + } + if (CompilerState.codeUsesYield(State)) + { + foreach (bool l13 in YP.unify(BodyWithReturn, BodyCode)) + { + foreach (bool l14 in YP.unify(FunctionCode, new Functor(@"function", new object[] { ReturnType, Name, FunctionArgs, BodyWithReturn }))) + { + yield return false; + } + } + goto cutIf27; + } + foreach (bool l12 in append(BodyCode, new ListPair(new Functor2(@"foreach", new Functor2(@"call", Atom.a(@"YP.fail"), Atom.NIL), new ListPair(Atom.a(@"yieldfalse"), Atom.NIL)), Atom.NIL), BodyWithReturn)) + { + foreach (bool l13 in YP.unify(FunctionCode, new Functor(@"function", new object[] { ReturnType, Name, FunctionArgs, BodyWithReturn }))) + { + yield return false; + } + } + cutIf27: + cutIf26: + cutIf25: + { } + } + goto cutIf24; + } + foreach (bool l10 in YP.unify(ReturnType, Atom.a(@"IEnumerable"))) + { + if (CompilerState.determinismEquals(State, Atom.a(@"semidetNoneOut"))) + { + foreach (bool l12 in append(BodyCode, new ListPair(Atom.a(@"returnfalse"), Atom.NIL), BodyWithReturn)) + { + foreach (bool l13 in YP.unify(FunctionCode, new Functor(@"function", new object[] { ReturnType, Name, FunctionArgs, BodyWithReturn }))) + { + yield return false; + } + } + goto cutIf28; + } + if (CompilerState.determinismEquals(State, Atom.a(@"detNoneOut"))) + { + foreach (bool l12 in YP.unify(BodyWithReturn, BodyCode)) + { + foreach (bool l13 in YP.unify(FunctionCode, new Functor(@"function", new object[] { ReturnType, Name, FunctionArgs, BodyWithReturn }))) + { + yield return false; + } + } + goto cutIf29; + } + if (CompilerState.codeUsesYield(State)) + { + foreach (bool l12 in YP.unify(BodyWithReturn, BodyCode)) + { + foreach (bool l13 in YP.unify(FunctionCode, new Functor(@"function", new object[] { ReturnType, Name, FunctionArgs, BodyWithReturn }))) + { + yield return false; + } + } + goto cutIf30; + } + foreach (bool l11 in append(BodyCode, new ListPair(new Functor2(@"foreach", new Functor2(@"call", Atom.a(@"YP.fail"), Atom.NIL), new ListPair(Atom.a(@"yieldfalse"), Atom.NIL)), Atom.NIL), BodyWithReturn)) + { + foreach (bool l12 in YP.unify(FunctionCode, new Functor(@"function", new object[] { ReturnType, Name, FunctionArgs, BodyWithReturn }))) + { + yield return false; + } + } + cutIf30: + cutIf29: + cutIf28: + { } + } + cutIf24: + cutIf20: + { } + } + } + } + } + } + } + } + cutIf2: + cutIf1: + { } + } + } + } + + public static IEnumerable samePredicateRuleList(object arg1, object arg2, object arg3) + { + { + foreach (bool l2 in YP.unify(arg1, Atom.NIL)) + { + foreach (bool l3 in YP.unify(arg2, Atom.NIL)) + { + foreach (bool l4 in YP.unify(arg3, Atom.NIL)) + { + yield return true; + yield break; + } + } + } + } + { + Variable First = new Variable(); + foreach (bool l2 in YP.unify(arg1, new ListPair(First, Atom.NIL))) + { + foreach (bool l3 in YP.unify(arg2, new ListPair(First, Atom.NIL))) + { + foreach (bool l4 in YP.unify(arg3, Atom.NIL)) + { + yield return true; + yield break; + } + } + } + } + { + object SamePredicateRuleList = arg2; + object RestRules = arg3; + Variable First = new Variable(); + Variable Rest = new Variable(); + Variable FirstRule = new Variable(); + Variable x6 = new Variable(); + Variable SecondRule = new Variable(); + Variable x8 = new Variable(); + Variable x9 = new Variable(); + Variable FirstHead = new Variable(); + Variable x11 = new Variable(); + Variable SecondHead = new Variable(); + Variable x13 = new Variable(); + Variable Name = new Variable(); + Variable Arity = new Variable(); + Variable RestSamePredicates = new Variable(); + foreach (bool l2 in YP.unify(arg1, new ListPair(First, Rest))) + { + foreach (bool l3 in YP.unify(new Functor2(@"f", FirstRule, x6), First)) + { + foreach (bool l4 in YP.unify(new ListPair(new Functor2(@"f", SecondRule, x8), x9), Rest)) + { + foreach (bool l5 in YP.unify(new Functor2(@":-", FirstHead, x11), FirstRule)) + { + foreach (bool l6 in YP.unify(new Functor2(@":-", SecondHead, x13), SecondRule)) + { + foreach (bool l7 in YP.functor(FirstHead, Name, Arity)) + { + foreach (bool l8 in YP.functor(SecondHead, Name, Arity)) + { + foreach (bool l9 in samePredicateRuleList(Rest, RestSamePredicates, RestRules)) + { + foreach (bool l10 in YP.unify(SamePredicateRuleList, new ListPair(First, RestSamePredicates))) + { + yield return true; + yield break; + } + } + goto cutIf3; + } + foreach (bool l8 in YP.unify(SamePredicateRuleList, new ListPair(First, Atom.NIL))) + { + foreach (bool l9 in YP.unify(RestRules, Rest)) + { + yield return true; + yield break; + } + } + cutIf3: + { } + } + goto cutIf2; + } + foreach (bool l6 in YP.unify(SecondHead, SecondRule)) + { + foreach (bool l7 in YP.functor(FirstHead, Name, Arity)) + { + foreach (bool l8 in YP.functor(SecondHead, Name, Arity)) + { + foreach (bool l9 in samePredicateRuleList(Rest, RestSamePredicates, RestRules)) + { + foreach (bool l10 in YP.unify(SamePredicateRuleList, new ListPair(First, RestSamePredicates))) + { + yield return true; + yield break; + } + } + goto cutIf4; + } + foreach (bool l8 in YP.unify(SamePredicateRuleList, new ListPair(First, Atom.NIL))) + { + foreach (bool l9 in YP.unify(RestRules, Rest)) + { + yield return true; + yield break; + } + } + cutIf4: + { } + } + } + cutIf2: + goto cutIf1; + } + foreach (bool l5 in YP.unify(FirstHead, FirstRule)) + { + foreach (bool l6 in YP.unify(new Functor2(@":-", SecondHead, x13), SecondRule)) + { + foreach (bool l7 in YP.functor(FirstHead, Name, Arity)) + { + foreach (bool l8 in YP.functor(SecondHead, Name, Arity)) + { + foreach (bool l9 in samePredicateRuleList(Rest, RestSamePredicates, RestRules)) + { + foreach (bool l10 in YP.unify(SamePredicateRuleList, new ListPair(First, RestSamePredicates))) + { + yield return true; + yield break; + } + } + goto cutIf6; + } + foreach (bool l8 in YP.unify(SamePredicateRuleList, new ListPair(First, Atom.NIL))) + { + foreach (bool l9 in YP.unify(RestRules, Rest)) + { + yield return true; + yield break; + } + } + cutIf6: + { } + } + goto cutIf5; + } + foreach (bool l6 in YP.unify(SecondHead, SecondRule)) + { + foreach (bool l7 in YP.functor(FirstHead, Name, Arity)) + { + foreach (bool l8 in YP.functor(SecondHead, Name, Arity)) + { + foreach (bool l9 in samePredicateRuleList(Rest, RestSamePredicates, RestRules)) + { + foreach (bool l10 in YP.unify(SamePredicateRuleList, new ListPair(First, RestSamePredicates))) + { + yield return true; + yield break; + } + } + goto cutIf7; + } + foreach (bool l8 in YP.unify(SamePredicateRuleList, new ListPair(First, Atom.NIL))) + { + foreach (bool l9 in YP.unify(RestRules, Rest)) + { + yield return true; + yield break; + } + } + cutIf7: + { } + } + } + cutIf5: + { } + } + cutIf1: + { } + } + } + } + } + } + + public static IEnumerable maplist_compileClause(object arg1, object arg2, object arg3) + { + { + object _MergedArgNames = arg2; + foreach (bool l2 in YP.unify(arg1, Atom.NIL)) + { + foreach (bool l3 in YP.unify(arg3, Atom.NIL)) + { + yield return true; + yield break; + } + } + } + { + object MergedArgNames = arg2; + Variable ArgAssignments = new Variable(); + Variable Calls = new Variable(); + Variable Rest = new Variable(); + Variable ClauseCode = new Variable(); + Variable RestResults = new Variable(); + foreach (bool l2 in YP.unify(arg1, new ListPair(new Functor2(@"f", ArgAssignments, Calls), Rest))) + { + foreach (bool l3 in YP.unify(arg3, new ListPair(new Functor1(@"blockScope", ClauseCode), RestResults))) + { + foreach (bool l4 in prependArgAssignments(ArgAssignments, Calls, MergedArgNames, ClauseCode)) + { + foreach (bool l5 in maplist_compileClause(Rest, MergedArgNames, RestResults)) + { + yield return true; + yield break; + } + } + } + } + } + } + + public static IEnumerable prependArgAssignments(object arg1, object arg2, object arg3, object arg4) + { + { + object _MergedArgNames = arg3; + Variable In = new Variable(); + foreach (bool l2 in YP.unify(arg1, Atom.NIL)) + { + foreach (bool l3 in YP.unify(arg2, In)) + { + foreach (bool l4 in YP.unify(arg4, In)) + { + yield return true; + yield break; + } + } + } + } + { + object In = arg2; + object MergedArgNames = arg3; + object ClauseCode = arg4; + Variable VariableName = new Variable(); + Variable ArgName = new Variable(); + Variable RestArgAssignments = new Variable(); + foreach (bool l2 in YP.unify(arg1, new ListPair(new Functor2(@"f", VariableName, ArgName), RestArgAssignments))) + { + foreach (bool l3 in member(VariableName, MergedArgNames)) + { + foreach (bool l4 in prependArgAssignments(RestArgAssignments, In, MergedArgNames, ClauseCode)) + { + yield return true; + yield break; + } + goto cutIf1; + } + foreach (bool l3 in prependArgAssignments(RestArgAssignments, new ListPair(new Functor3(@"declare", Atom.a(@"object"), VariableName, new Functor1(@"var", ArgName)), In), MergedArgNames, ClauseCode)) + { + yield return true; + yield break; + } + cutIf1: + { } + } + } + } + + public static IEnumerable argAssignedAll(object arg1, object arg2, object VariableName) + { + { + object _ArgName = arg1; + foreach (bool l2 in YP.unify(arg2, Atom.NIL)) + { + if (YP.nonvar(VariableName)) + { + yield return true; + yield break; + } + } + } + { + object ArgName = arg1; + Variable ArgAssignments = new Variable(); + Variable _Calls = new Variable(); + Variable RestClauseBag = new Variable(); + foreach (bool l2 in YP.unify(arg2, new ListPair(new Functor2(@"f", ArgAssignments, _Calls), RestClauseBag))) + { + foreach (bool l3 in member(new Functor2(@"f", VariableName, ArgName), ArgAssignments)) + { + foreach (bool l4 in argAssignedAll(ArgName, RestClauseBag, VariableName)) + { + yield return false; + } + } + } + } + } + + public static IEnumerable maplist_arg(object arg1, object arg2) + { + { + foreach (bool l2 in YP.unify(arg1, Atom.NIL)) + { + foreach (bool l3 in YP.unify(arg2, Atom.NIL)) + { + yield return true; + yield break; + } + } + } + { + Variable First = new Variable(); + Variable Rest = new Variable(); + Variable RestResults = new Variable(); + foreach (bool l2 in YP.unify(arg1, new ListPair(First, Rest))) + { + foreach (bool l3 in YP.unify(arg2, new ListPair(new Functor1(@"arg", First), RestResults))) + { + foreach (bool l4 in maplist_arg(Rest, RestResults)) + { + yield return true; + yield break; + } + } + } + } + } + + public static IEnumerable getFunctionArgNames(object arg1, object arg2, object arg3) + { + { + object _StartArgNumber = arg2; + foreach (bool l2 in YP.unify(arg1, Atom.NIL)) + { + foreach (bool l3 in YP.unify(arg3, Atom.NIL)) + { + yield return true; + yield break; + } + } + } + { + object StartArgNumber = arg2; + Variable x1 = new Variable(); + Variable Rest = new Variable(); + Variable ArgName = new Variable(); + Variable RestFunctionArgs = new Variable(); + Variable NumberCodes = new Variable(); + Variable NumberAtom = new Variable(); + Variable NextArgNumber = new Variable(); + foreach (bool l2 in YP.unify(arg1, new ListPair(x1, Rest))) + { + foreach (bool l3 in YP.unify(arg3, new ListPair(ArgName, RestFunctionArgs))) + { + foreach (bool l4 in YP.number_codes(StartArgNumber, NumberCodes)) + { + foreach (bool l5 in YP.atom_codes(NumberAtom, NumberCodes)) + { + foreach (bool l6 in YP.atom_concat(Atom.a(@"arg"), NumberAtom, ArgName)) + { + foreach (bool l7 in YP.unify(NextArgNumber, YP.add(StartArgNumber, 1))) + { + foreach (bool l8 in getFunctionArgNames(Rest, NextArgNumber, RestFunctionArgs)) + { + yield return true; + yield break; + } + } + } + } + } + } + } + } + } + + public static IEnumerable compileBodyWithHeadBindings(object Rule, object VariableNameSuggestions, object State, object ArgAssignments, object Calls) + { + { + Variable Head = new Variable(); + Variable Body = new Variable(); + Variable x8 = new Variable(); + Variable HeadArgs = new Variable(); + Variable CompiledHeadArgs = new Variable(); + Variable BodyCode = new Variable(); + Variable VariableNamesList = new Variable(); + Variable ArgUnifications = new Variable(); + foreach (bool l2 in YP.unify(new Functor2(@":-", Head, Body), Rule)) + { + CompilerState.newVariableNames(State, Rule, VariableNameSuggestions); + foreach (bool l3 in YP.univ(Head, new ListPair(x8, HeadArgs))) + { + foreach (bool l4 in maplist_compileTerm(HeadArgs, State, CompiledHeadArgs)) + { + foreach (bool l5 in compileRuleBody(Body, State, BodyCode)) + { + foreach (bool l6 in CompilerState.variableNamesList(State, VariableNamesList)) + { + foreach (bool l7 in compileArgUnifications(HeadArgs, CompiledHeadArgs, 1, HeadArgs, BodyCode, ArgUnifications)) + { + foreach (bool l8 in compileDeclarations(VariableNamesList, HeadArgs, Atom.NIL, ArgAssignments, ArgUnifications, Calls)) + { + yield return true; + yield break; + } + } + } + } + } + } + } + } + { + foreach (bool l2 in compileBodyWithHeadBindings(new Functor2(@":-", Rule, Atom.a(@"true")), VariableNameSuggestions, State, ArgAssignments, Calls)) + { + yield return true; + yield break; + } + } + } + + public static IEnumerable compileArgUnifications(object arg1, object arg2, object arg3, object arg4, object arg5, object arg6) + { + { + object x1 = arg2; + object x2 = arg3; + object x3 = arg4; + Variable BodyCode = new Variable(); + foreach (bool l2 in YP.unify(arg1, Atom.NIL)) + { + foreach (bool l3 in YP.unify(arg5, BodyCode)) + { + foreach (bool l4 in YP.unify(arg6, BodyCode)) + { + yield return true; + yield break; + } + } + } + } + { + object Index = arg3; + object AllHeadArgs = arg4; + object BodyCode = arg5; + object ArgUnifications = arg6; + Variable HeadArg = new Variable(); + Variable RestHeadArgs = new Variable(); + Variable x3 = new Variable(); + Variable RestCompiledHeadArgs = new Variable(); + Variable _ArgIndex1 = new Variable(); + Variable NextIndex = new Variable(); + foreach (bool l2 in YP.unify(arg1, new ListPair(HeadArg, RestHeadArgs))) + { + foreach (bool l3 in YP.unify(arg2, new ListPair(x3, RestCompiledHeadArgs))) + { + foreach (bool l4 in getVariableArgIndex1(HeadArg, AllHeadArgs, _ArgIndex1)) + { + foreach (bool l5 in YP.unify(NextIndex, YP.add(Index, 1))) + { + foreach (bool l6 in compileArgUnifications(RestHeadArgs, RestCompiledHeadArgs, NextIndex, AllHeadArgs, BodyCode, ArgUnifications)) + { + yield return true; + yield break; + } + } + } + } + } + } + { + object Index = arg3; + object AllHeadArgs = arg4; + object BodyCode = arg5; + Variable _HeadArg = new Variable(); + Variable RestHeadArgs = new Variable(); + Variable CompiledHeadArg = new Variable(); + Variable RestCompiledHeadArgs = new Variable(); + Variable ArgName = new Variable(); + Variable RestArgUnifications = new Variable(); + Variable NumberCodes = new Variable(); + Variable NumberAtom = new Variable(); + Variable NextIndex = new Variable(); + foreach (bool l2 in YP.unify(arg1, new ListPair(_HeadArg, RestHeadArgs))) + { + foreach (bool l3 in YP.unify(arg2, new ListPair(CompiledHeadArg, RestCompiledHeadArgs))) + { + foreach (bool l4 in YP.unify(arg6, new ListPair(new Functor2(@"foreach", new Functor2(@"call", Atom.a(@"YP.unify"), new ListPair(new Functor1(@"var", ArgName), new ListPair(CompiledHeadArg, Atom.NIL))), RestArgUnifications), Atom.NIL))) + { + foreach (bool l5 in YP.number_codes(Index, NumberCodes)) + { + foreach (bool l6 in YP.atom_codes(NumberAtom, NumberCodes)) + { + foreach (bool l7 in YP.atom_concat(Atom.a(@"arg"), NumberAtom, ArgName)) + { + foreach (bool l8 in YP.unify(NextIndex, YP.add(Index, 1))) + { + foreach (bool l9 in compileArgUnifications(RestHeadArgs, RestCompiledHeadArgs, NextIndex, AllHeadArgs, BodyCode, RestArgUnifications)) + { + yield return true; + yield break; + } + } + } + } + } + } + } + } + } + } + + public static IEnumerable compileDeclarations(object arg1, object arg2, object arg3, object arg4, object arg5, object arg6) + { + { + object _HeadArgs = arg2; + Variable ArgAssignmentsIn = new Variable(); + Variable DeclarationsIn = new Variable(); + foreach (bool l2 in YP.unify(arg1, Atom.NIL)) + { + foreach (bool l3 in YP.unify(arg3, ArgAssignmentsIn)) + { + foreach (bool l4 in YP.unify(arg4, ArgAssignmentsIn)) + { + foreach (bool l5 in YP.unify(arg5, DeclarationsIn)) + { + foreach (bool l6 in YP.unify(arg6, DeclarationsIn)) + { + yield return true; + yield break; + } + } + } + } + } + } + { + object HeadArgs = arg2; + object ArgAssignmentsIn = arg3; + object ArgAssignmentsOut = arg4; + object DeclarationsIn = arg5; + object DeclarationsOut = arg6; + Variable VariableName = new Variable(); + Variable Var = new Variable(); + Variable RestVariableNames = new Variable(); + Variable ArgIndex1 = new Variable(); + Variable NumberCodes = new Variable(); + Variable NumberAtom = new Variable(); + Variable ArgName = new Variable(); + foreach (bool l2 in YP.unify(arg1, new ListPair(new Functor2(@"=", VariableName, Var), RestVariableNames))) + { + foreach (bool l3 in getVariableArgIndex1(Var, HeadArgs, ArgIndex1)) + { + foreach (bool l4 in YP.number_codes(ArgIndex1, NumberCodes)) + { + foreach (bool l5 in YP.atom_codes(NumberAtom, NumberCodes)) + { + foreach (bool l6 in YP.atom_concat(Atom.a(@"arg"), NumberAtom, ArgName)) + { + foreach (bool l7 in compileDeclarations(RestVariableNames, HeadArgs, new ListPair(new Functor2(@"f", VariableName, ArgName), ArgAssignmentsIn), ArgAssignmentsOut, DeclarationsIn, DeclarationsOut)) + { + yield return true; + yield break; + } + } + } + } + } + } + } + { + object HeadArgs = arg2; + object ArgAssignmentsIn = arg3; + object ArgAssignmentsOut = arg4; + object DeclarationsIn = arg5; + Variable VariableName = new Variable(); + Variable _Var = new Variable(); + Variable RestVariableNames = new Variable(); + Variable DeclarationsOut = new Variable(); + foreach (bool l2 in YP.unify(arg1, new ListPair(new Functor2(@"=", VariableName, _Var), RestVariableNames))) + { + foreach (bool l3 in YP.unify(arg6, new ListPair(new Functor3(@"declare", Atom.a(@"Variable"), VariableName, new Functor2(@"new", Atom.a(@"Variable"), Atom.NIL)), DeclarationsOut))) + { + foreach (bool l4 in compileDeclarations(RestVariableNames, HeadArgs, ArgAssignmentsIn, ArgAssignmentsOut, DeclarationsIn, DeclarationsOut)) + { + yield return true; + yield break; + } + } + } + } + } + + public static IEnumerable getVariableArgIndex1(object Var, object arg2, object arg3) + { + { + Variable FirstHeadArgs = new Variable(); + Variable RestHeadArgs = new Variable(); + Variable x4 = new Variable(); + foreach (bool l2 in YP.unify(arg2, new ListPair(FirstHeadArgs, RestHeadArgs))) + { + foreach (bool l3 in YP.unify(arg3, 1)) + { + if (sameVariable(Var, FirstHeadArgs)) + { + foreach (bool l5 in getVariableArgIndex1(Var, RestHeadArgs, x4)) + { + goto cutIf1; + } + yield return false; + cutIf1: + yield break; + } + } + } + } + { + object Index = arg3; + Variable x2 = new Variable(); + Variable RestHeadArgs = new Variable(); + Variable RestIndex = new Variable(); + foreach (bool l2 in YP.unify(arg2, new ListPair(x2, RestHeadArgs))) + { + foreach (bool l3 in getVariableArgIndex1(Var, RestHeadArgs, RestIndex)) + { + foreach (bool l4 in YP.unify(Index, YP.add(1, RestIndex))) + { + yield return true; + yield break; + } + } + } + } + } + + public static IEnumerable compileRuleBody(object arg1, object arg2, object arg3) + { + { + object A = arg1; + object State = arg2; + object PseudoCode = arg3; + if (YP.var(A)) + { + foreach (bool l3 in compileRuleBody(new Functor2(@",", new Functor1(@"call", A), Atom.a(@"true")), State, PseudoCode)) + { + yield return true; + yield break; + } + } + } + { + object State = arg2; + foreach (bool l2 in YP.unify(arg1, Atom.a(@"!"))) + { + foreach (bool l3 in YP.unify(arg3, new ListPair(Atom.a(@"return"), Atom.NIL))) + { + if (CompilerState.determinismEquals(State, Atom.a(@"detNoneOut"))) + { + yield return true; + yield break; + } + } + } + } + { + object State = arg2; + foreach (bool l2 in YP.unify(arg1, Atom.a(@"!"))) + { + foreach (bool l3 in YP.unify(arg3, new ListPair(Atom.a(@"returntrue"), Atom.NIL))) + { + if (CompilerState.determinismEquals(State, Atom.a(@"semidetNoneOut"))) + { + yield return true; + yield break; + } + } + } + } + { + object State = arg2; + foreach (bool l2 in YP.unify(arg1, Atom.a(@"!"))) + { + foreach (bool l3 in YP.unify(arg3, new ListPair(Atom.a(@"yieldtrue"), new ListPair(Atom.a(@"yieldbreak"), Atom.NIL)))) + { + CompilerState.setCodeUsesYield(State); + yield return true; + yield break; + } + } + } + { + object _State = arg2; + Variable Name = new Variable(); + foreach (bool l2 in YP.unify(arg1, new Functor1(@"$CUTIF", Name))) + { + foreach (bool l3 in YP.unify(arg3, new ListPair(new Functor1(@"breakBlock", Name), Atom.NIL))) + { + yield return true; + yield break; + } + } + } + { + object State = arg2; + foreach (bool l2 in YP.unify(arg1, Atom.a(@"true"))) + { + foreach (bool l3 in YP.unify(arg3, new ListPair(Atom.a(@"return"), Atom.NIL))) + { + if (CompilerState.determinismEquals(State, Atom.a(@"detNoneOut"))) + { + yield return true; + yield break; + } + } + } + } + { + object State = arg2; + foreach (bool l2 in YP.unify(arg1, Atom.a(@"true"))) + { + foreach (bool l3 in YP.unify(arg3, new ListPair(Atom.a(@"returntrue"), Atom.NIL))) + { + if (CompilerState.determinismEquals(State, Atom.a(@"semidetNoneOut"))) + { + yield return true; + yield break; + } + } + } + } + { + object State = arg2; + foreach (bool l2 in YP.unify(arg1, Atom.a(@"true"))) + { + foreach (bool l3 in YP.unify(arg3, new ListPair(Atom.a(@"yieldfalse"), Atom.NIL))) + { + CompilerState.setCodeUsesYield(State); + yield return true; + yield break; + } + } + } + { + object State = arg2; + object PseudoCode = arg3; + Variable A = new Variable(); + Variable B = new Variable(); + foreach (bool l2 in YP.unify(arg1, new Functor2(@",", A, B))) + { + if (YP.var(A)) + { + foreach (bool l4 in compileRuleBody(new Functor2(@",", new Functor1(@"call", A), B), State, PseudoCode)) + { + yield return true; + yield break; + } + } + } + } + { + object State = arg2; + object PseudoCode = arg3; + Variable A = new Variable(); + Variable T = new Variable(); + Variable B = new Variable(); + Variable C = new Variable(); + foreach (bool l2 in YP.unify(arg1, new Functor2(@",", new Functor2(@";", new Functor2(@"->", A, T), B), C))) + { + foreach (bool l3 in compileRuleBody(new Functor2(@";", new Functor2(@"->", A, new Functor2(@",", T, C)), new Functor2(@",", B, C)), State, PseudoCode)) + { + yield return true; + yield break; + } + } + } + { + object State = arg2; + object PseudoCode = arg3; + Variable A = new Variable(); + Variable B = new Variable(); + Variable C = new Variable(); + foreach (bool l2 in YP.unify(arg1, new Functor2(@",", new Functor2(@";", A, B), C))) + { + foreach (bool l3 in compileRuleBody(new Functor2(@";", new Functor2(@",", A, C), new Functor2(@",", B, C)), State, PseudoCode)) + { + yield return true; + yield break; + } + } + } + { + object State = arg2; + Variable A = new Variable(); + Variable B = new Variable(); + Variable ACode = new Variable(); + Variable BCode = new Variable(); + foreach (bool l2 in YP.unify(arg1, new Functor2(@",", new Functor1(@"\+", A), B))) + { + foreach (bool l3 in YP.unify(arg3, new ListPair(new Functor2(@"if", new Functor1(@"not", ACode), BCode), Atom.NIL))) + { + if (CompilerState.isSemidetNoneOut(State, A)) + { + foreach (bool l5 in compileFunctorCall(A, State, ACode)) + { + foreach (bool l6 in compileRuleBody(B, State, BCode)) + { + yield return true; + yield break; + } + } + } + } + } + } + { + object State = arg2; + object PseudoCode = arg3; + Variable A = new Variable(); + Variable B = new Variable(); + foreach (bool l2 in YP.unify(arg1, new Functor2(@",", new Functor1(@"\+", A), B))) + { + foreach (bool l3 in compileRuleBody(new Functor2(@",", new Functor2(@";", new Functor2(@"->", A, Atom.a(@"fail")), Atom.a(@"true")), B), State, PseudoCode)) + { + yield return true; + yield break; + } + } + } + { + object State = arg2; + object PseudoCode = arg3; + Variable A = new Variable(); + Variable B = new Variable(); + foreach (bool l2 in YP.unify(arg1, new Functor2(@",", new Functor1(@"once", A), B))) + { + foreach (bool l3 in compileRuleBody(new Functor2(@",", new Functor2(@";", new Functor2(@"->", A, Atom.a(@"true")), Atom.a(@"fail")), B), State, PseudoCode)) + { + yield return true; + yield break; + } + } + } + { + object State = arg2; + object PseudoCode = arg3; + Variable A = new Variable(); + Variable T = new Variable(); + Variable B = new Variable(); + foreach (bool l2 in YP.unify(arg1, new Functor2(@",", new Functor2(@"->", A, T), B))) + { + foreach (bool l3 in compileRuleBody(new Functor2(@",", new Functor2(@";", new Functor2(@"->", A, T), Atom.a(@"fail")), B), State, PseudoCode)) + { + yield return true; + yield break; + } + } + } + { + object State = arg2; + object PseudoCode = arg3; + Variable A = new Variable(); + Variable B = new Variable(); + Variable C = new Variable(); + foreach (bool l2 in YP.unify(arg1, new Functor2(@",", new Functor2(@"\=", A, B), C))) + { + foreach (bool l3 in compileRuleBody(new Functor2(@",", new Functor1(@"\+", new Functor2(@"=", A, B)), C), State, PseudoCode)) + { + yield return true; + yield break; + } + } + } + { + object State = arg2; + object PseudoCode = arg3; + Variable A = new Variable(); + Variable ACode = new Variable(); + foreach (bool l2 in YP.unify(arg1, new Functor2(@",", Atom.a(@"!"), A))) + { + foreach (bool l3 in compileRuleBody(A, State, ACode)) + { + foreach (bool l4 in append(ACode, new ListPair(Atom.a(@"yieldbreak"), Atom.NIL), PseudoCode)) + { + yield return true; + yield break; + } + } + } + } + { + object State = arg2; + object PseudoCode = arg3; + Variable Name = new Variable(); + Variable A = new Variable(); + Variable ACode = new Variable(); + foreach (bool l2 in YP.unify(arg1, new Functor2(@",", new Functor1(@"$CUTIF", Name), A))) + { + foreach (bool l3 in compileRuleBody(A, State, ACode)) + { + foreach (bool l4 in append(ACode, new ListPair(new Functor1(@"breakBlock", Name), Atom.NIL), PseudoCode)) + { + yield return true; + yield break; + } + } + } + } + { + object _State = arg2; + Variable x1 = new Variable(); + foreach (bool l2 in YP.unify(arg1, new Functor2(@",", Atom.a(@"fail"), x1))) + { + foreach (bool l3 in YP.unify(arg3, Atom.NIL)) + { + yield return true; + yield break; + } + } + } + { + object State = arg2; + object PseudoCode = arg3; + Variable A = new Variable(); + foreach (bool l2 in YP.unify(arg1, new Functor2(@",", Atom.a(@"true"), A))) + { + foreach (bool l3 in compileRuleBody(A, State, PseudoCode)) + { + yield return true; + yield break; + } + } + } + { + object State = arg2; + Variable A = new Variable(); + Variable Term = new Variable(); + Variable B = new Variable(); + Variable ACode = new Variable(); + Variable TermCode = new Variable(); + Variable BCode = new Variable(); + foreach (bool l2 in YP.unify(arg1, new Functor2(@",", new Functor2(@"is", A, Term), B))) + { + foreach (bool l3 in YP.unify(arg3, new ListPair(new Functor2(@"foreach", new Functor2(@"call", Atom.a(@"YP.unify"), new ListPair(ACode, new ListPair(TermCode, Atom.NIL))), BCode), Atom.NIL))) + { + foreach (bool l4 in compileTerm(A, State, ACode)) + { + foreach (bool l5 in compileExpression(Term, State, TermCode)) + { + foreach (bool l6 in compileRuleBody(B, State, BCode)) + { + yield return true; + yield break; + } + } + } + } + } + } + { + object State = arg2; + Variable A = new Variable(); + Variable B = new Variable(); + Variable ACode = new Variable(); + Variable BCode = new Variable(); + foreach (bool l2 in YP.unify(arg1, new Functor2(@",", A, B))) + { + foreach (bool l3 in YP.unify(arg3, new ListPair(ACode, BCode))) + { + if (CompilerState.isDetNoneOut(State, A)) + { + foreach (bool l5 in compileFunctorCall(A, State, ACode)) + { + foreach (bool l6 in compileRuleBody(B, State, BCode)) + { + yield return true; + yield break; + } + } + } + } + } + } + { + object State = arg2; + Variable A = new Variable(); + Variable B = new Variable(); + Variable ACode = new Variable(); + Variable BCode = new Variable(); + foreach (bool l2 in YP.unify(arg1, new Functor2(@",", A, B))) + { + foreach (bool l3 in YP.unify(arg3, new ListPair(new Functor2(@"if", ACode, BCode), Atom.NIL))) + { + if (CompilerState.isSemidetNoneOut(State, A)) + { + foreach (bool l5 in compileFunctorCall(A, State, ACode)) + { + foreach (bool l6 in compileRuleBody(B, State, BCode)) + { + yield return true; + yield break; + } + } + } + } + } + } + { + object State = arg2; + Variable ACode = new Variable(); + Variable B = new Variable(); + Variable BCode = new Variable(); + foreach (bool l2 in YP.unify(arg1, new Functor2(@",", new Functor1(@"$DET_NONE_OUT", ACode), B))) + { + foreach (bool l3 in YP.unify(arg3, new ListPair(ACode, BCode))) + { + foreach (bool l4 in compileRuleBody(B, State, BCode)) + { + yield return true; + yield break; + } + } + } + } + { + object State = arg2; + Variable A = new Variable(); + Variable B = new Variable(); + Variable FunctionName = new Variable(); + Variable X1Code = new Variable(); + Variable X2Code = new Variable(); + Variable BCode = new Variable(); + Variable Name = new Variable(); + Variable X1 = new Variable(); + Variable X2 = new Variable(); + foreach (bool l2 in YP.unify(arg1, new Functor2(@",", A, B))) + { + foreach (bool l3 in YP.unify(arg3, new ListPair(new Functor2(@"if", new Functor2(@"call", FunctionName, new ListPair(X1Code, new ListPair(X2Code, Atom.NIL))), BCode), Atom.NIL))) + { + foreach (bool l4 in YP.univ(A, new ListPair(Name, new ListPair(X1, new ListPair(X2, Atom.NIL))))) + { + foreach (bool l5 in binaryExpressionConditional(Name, FunctionName)) + { + foreach (bool l6 in compileExpression(X1, State, X1Code)) + { + foreach (bool l7 in compileExpression(X2, State, X2Code)) + { + foreach (bool l8 in compileRuleBody(B, State, BCode)) + { + yield return true; + yield break; + } + } + } + } + } + } + } + } + { + object State = arg2; + object PseudoCode = arg3; + Variable A = new Variable(); + Variable B = new Variable(); + Variable C = new Variable(); + foreach (bool l2 in YP.unify(arg1, new Functor2(@",", new Functor2(@",", A, B), C))) + { + foreach (bool l3 in compileRuleBody(new Functor2(@",", A, new Functor2(@",", B, C)), State, PseudoCode)) + { + yield return true; + yield break; + } + } + } + { + object State = arg2; + object PseudoCode = arg3; + Variable Template = new Variable(); + Variable Goal = new Variable(); + Variable Bag = new Variable(); + Variable B = new Variable(); + Variable TemplateCode = new Variable(); + Variable FindallAnswers = new Variable(); + Variable GoalAndAddCode = new Variable(); + Variable BagCode = new Variable(); + Variable BCode = new Variable(); + foreach (bool l2 in YP.unify(arg1, new Functor2(@",", new Functor3(@"findall", Template, Goal, Bag), B))) + { + foreach (bool l3 in compileTerm(Template, State, TemplateCode)) + { + foreach (bool l4 in CompilerState.gensym(State, Atom.a(@"findallAnswers"), FindallAnswers)) + { + foreach (bool l5 in compileRuleBody(new Functor2(@",", Goal, new Functor2(@",", new Functor1(@"$DET_NONE_OUT", new Functor3(@"callMember", new Functor1(@"var", FindallAnswers), Atom.a(@"add"), Atom.NIL)), Atom.a(@"fail"))), State, GoalAndAddCode)) + { + foreach (bool l6 in compileTerm(Bag, State, BagCode)) + { + foreach (bool l7 in compileRuleBody(B, State, BCode)) + { + foreach (bool l8 in append(new ListPair(new Functor3(@"declare", Atom.a(@"FindallAnswers"), FindallAnswers, new Functor2(@"new", Atom.a(@"FindallAnswers"), new ListPair(TemplateCode, Atom.NIL))), GoalAndAddCode), new ListPair(new Functor2(@"foreach", new Functor3(@"callMember", new Functor1(@"var", FindallAnswers), Atom.a(@"result"), new ListPair(BagCode, Atom.NIL)), BCode), Atom.NIL), PseudoCode)) + { + yield return true; + yield break; + } + } + } + } + } + } + } + } + { + object State = arg2; + object PseudoCode = arg3; + Variable Template = new Variable(); + Variable Goal = new Variable(); + Variable Bag = new Variable(); + Variable B = new Variable(); + foreach (bool l2 in YP.unify(arg1, new Functor2(@",", new Functor3(@"bagof", Template, Goal, Bag), B))) + { + foreach (bool l3 in compileBagof(Atom.a(@"result"), Template, Goal, Bag, B, State, PseudoCode)) + { + yield return true; + yield break; + } + } + } + { + object State = arg2; + object PseudoCode = arg3; + Variable Template = new Variable(); + Variable Goal = new Variable(); + Variable Bag = new Variable(); + Variable B = new Variable(); + foreach (bool l2 in YP.unify(arg1, new Functor2(@",", new Functor3(@"setof", Template, Goal, Bag), B))) + { + foreach (bool l3 in compileBagof(Atom.a(@"resultSet"), Template, Goal, Bag, B, State, PseudoCode)) + { + yield return true; + yield break; + } + } + } + { + object State = arg2; + Variable A = new Variable(); + Variable B = new Variable(); + Variable ATermCode = new Variable(); + Variable BCode = new Variable(); + foreach (bool l2 in YP.unify(arg1, new Functor2(@",", new Functor1(@"call", A), B))) + { + foreach (bool l3 in YP.unify(arg3, new ListPair(new Functor2(@"foreach", new Functor2(@"call", Atom.a(@"YP.getIterator"), new ListPair(ATermCode, new ListPair(new Functor2(@"call", Atom.a(@"getDeclaringClass"), Atom.NIL), Atom.NIL))), BCode), Atom.NIL))) + { + foreach (bool l4 in compileTerm(A, State, ATermCode)) + { + foreach (bool l5 in compileRuleBody(B, State, BCode)) + { + yield return true; + yield break; + } + } + } + } + } + { + object State = arg2; + Variable A = new Variable(); + Variable B = new Variable(); + Variable ATermCode = new Variable(); + Variable BCode = new Variable(); + foreach (bool l2 in YP.unify(arg1, new Functor2(@",", new Functor1(@"asserta", A), B))) + { + foreach (bool l3 in YP.unify(arg3, new ListPair(new Functor2(@"call", Atom.a(@"YP.asserta"), new ListPair(ATermCode, new ListPair(new Functor2(@"call", Atom.a(@"getDeclaringClass"), Atom.NIL), Atom.NIL))), BCode))) + { + foreach (bool l4 in compileTerm(A, State, ATermCode)) + { + foreach (bool l5 in compileRuleBody(B, State, BCode)) + { + yield return true; + yield break; + } + } + } + } + } + { + object State = arg2; + Variable A = new Variable(); + Variable B = new Variable(); + Variable ATermCode = new Variable(); + Variable BCode = new Variable(); + foreach (bool l2 in YP.unify(arg1, new Functor2(@",", new Functor1(@"assertz", A), B))) + { + foreach (bool l3 in YP.unify(arg3, new ListPair(new Functor2(@"call", Atom.a(@"YP.assertz"), new ListPair(ATermCode, new ListPair(new Functor2(@"call", Atom.a(@"getDeclaringClass"), Atom.NIL), Atom.NIL))), BCode))) + { + foreach (bool l4 in compileTerm(A, State, ATermCode)) + { + foreach (bool l5 in compileRuleBody(B, State, BCode)) + { + yield return true; + yield break; + } + } + } + } + } + { + object State = arg2; + object PseudoCode = arg3; + Variable A = new Variable(); + Variable B = new Variable(); + foreach (bool l2 in YP.unify(arg1, new Functor2(@",", new Functor1(@"assert", A), B))) + { + foreach (bool l3 in compileRuleBody(new Functor2(@",", new Functor1(@"assertz", A), B), State, PseudoCode)) + { + yield return true; + yield break; + } + } + } + { + object State = arg2; + Variable Goal = new Variable(); + Variable Catcher = new Variable(); + Variable Handler = new Variable(); + Variable B = new Variable(); + Variable CatchGoal = new Variable(); + Variable GoalTermCode = new Variable(); + Variable BCode = new Variable(); + Variable CatcherTermCode = new Variable(); + Variable HandlerAndBCode = new Variable(); + foreach (bool l2 in YP.unify(arg1, new Functor2(@",", new Functor3(@"catch", Goal, Catcher, Handler), B))) + { + foreach (bool l3 in YP.unify(arg3, new ListPair(new Functor3(@"declare", Atom.a(@"YP.Catch"), CatchGoal, new Functor2(@"new", Atom.a(@"YP.Catch"), new ListPair(new Functor2(@"call", Atom.a(@"YP.getIterator"), new ListPair(GoalTermCode, new ListPair(new Functor2(@"call", Atom.a(@"getDeclaringClass"), Atom.NIL), Atom.NIL))), Atom.NIL))), new ListPair(new Functor2(@"foreach", new Functor1(@"var", CatchGoal), BCode), new ListPair(new Functor2(@"foreach", new Functor3(@"callMember", new Functor1(@"var", CatchGoal), Atom.a(@"unifyExceptionOrThrow"), new ListPair(CatcherTermCode, Atom.NIL)), HandlerAndBCode), Atom.NIL))))) + { + foreach (bool l4 in CompilerState.gensym(State, Atom.a(@"catchGoal"), CatchGoal)) + { + foreach (bool l5 in compileTerm(Goal, State, GoalTermCode)) + { + foreach (bool l6 in compileTerm(Catcher, State, CatcherTermCode)) + { + foreach (bool l7 in compileRuleBody(B, State, BCode)) + { + foreach (bool l8 in compileRuleBody(new Functor2(@",", Handler, B), State, HandlerAndBCode)) + { + yield return true; + yield break; + } + } + } + } + } + } + } + } + { + object State = arg2; + Variable A = new Variable(); + Variable B = new Variable(); + Variable ACode = new Variable(); + Variable BCode = new Variable(); + foreach (bool l2 in YP.unify(arg1, new Functor2(@",", A, B))) + { + foreach (bool l3 in YP.unify(arg3, new ListPair(new Functor2(@"foreach", ACode, BCode), Atom.NIL))) + { + foreach (bool l4 in compileFunctorCall(A, State, ACode)) + { + foreach (bool l5 in compileRuleBody(B, State, BCode)) + { + yield return true; + yield break; + } + } + } + } + } + { + object State = arg2; + object PseudoCode = arg3; + Variable A = new Variable(); + Variable B = new Variable(); + foreach (bool l2 in YP.unify(arg1, new Functor2(@";", A, B))) + { + if (YP.var(A)) + { + foreach (bool l4 in compileRuleBody(new Functor2(@";", new Functor1(@"call", A), B), State, PseudoCode)) + { + yield return true; + yield break; + } + } + } + } + { + object State = arg2; + Variable A = new Variable(); + Variable T = new Variable(); + Variable B = new Variable(); + Variable CutIfLabel = new Variable(); + Variable Code = new Variable(); + foreach (bool l2 in YP.unify(arg1, new Functor2(@";", new Functor2(@"->", A, T), B))) + { + foreach (bool l3 in YP.unify(arg3, new ListPair(new Functor2(@"breakableBlock", CutIfLabel, Code), Atom.NIL))) + { + foreach (bool l4 in CompilerState.gensym(State, Atom.a(@"cutIf"), CutIfLabel)) + { + foreach (bool l5 in compileRuleBody(new Functor2(@";", new Functor2(@",", A, new Functor2(@",", new Functor1(@"$CUTIF", CutIfLabel), T)), B), State, Code)) + { + yield return true; + yield break; + } + } + } + } + } + { + object State = arg2; + object PseudoCode = arg3; + Variable A = new Variable(); + Variable B = new Variable(); + Variable ACode = new Variable(); + Variable BCode = new Variable(); + foreach (bool l2 in YP.unify(arg1, new Functor2(@";", A, B))) + { + foreach (bool l3 in compileRuleBody(A, State, ACode)) + { + foreach (bool l4 in compileRuleBody(B, State, BCode)) + { + foreach (bool l5 in append(ACode, BCode, PseudoCode)) + { + yield return true; + yield break; + } + } + } + } + } + { + object A = arg1; + object State = arg2; + object PseudoCode = arg3; + foreach (bool l2 in compileRuleBody(new Functor2(@",", A, Atom.a(@"true")), State, PseudoCode)) + { + yield return true; + yield break; + } + } + } + + public static IEnumerable compileBagof(object ResultMethod, object Template, object Goal, object Bag, object B, object State, object PseudoCode) + { + { + Variable TemplateCode = new Variable(); + Variable GoalTermCode = new Variable(); + Variable UnqualifiedGoal = new Variable(); + Variable BagofAnswers = new Variable(); + Variable GoalAndAddCode = new Variable(); + Variable BagCode = new Variable(); + Variable BCode = new Variable(); + foreach (bool l2 in compileTerm(Template, State, TemplateCode)) + { + foreach (bool l3 in compileTerm(Goal, State, GoalTermCode)) + { + foreach (bool l4 in unqualifiedGoal(Goal, UnqualifiedGoal)) + { + foreach (bool l5 in CompilerState.gensym(State, Atom.a(@"bagofAnswers"), BagofAnswers)) + { + foreach (bool l6 in compileRuleBody(new Functor2(@",", UnqualifiedGoal, new Functor2(@",", new Functor1(@"$DET_NONE_OUT", new Functor3(@"callMember", new Functor1(@"var", BagofAnswers), Atom.a(@"add"), Atom.NIL)), Atom.a(@"fail"))), State, GoalAndAddCode)) + { + foreach (bool l7 in compileTerm(Bag, State, BagCode)) + { + foreach (bool l8 in compileRuleBody(B, State, BCode)) + { + foreach (bool l9 in append(new ListPair(new Functor3(@"declare", Atom.a(@"BagofAnswers"), BagofAnswers, new Functor2(@"new", Atom.a(@"BagofAnswers"), new ListPair(TemplateCode, new ListPair(GoalTermCode, Atom.NIL)))), GoalAndAddCode), new ListPair(new Functor2(@"foreach", new Functor3(@"callMember", new Functor1(@"var", BagofAnswers), ResultMethod, new ListPair(BagCode, Atom.NIL)), BCode), Atom.NIL), PseudoCode)) + { + yield return true; + yield break; + } + } + } + } + } + } + } + } + } + } + + public static IEnumerable unqualifiedGoal(object arg1, object arg2) + { + { + object Goal = arg1; + foreach (bool l2 in YP.unify(arg2, new Functor1(@"call", Goal))) + { + if (YP.var(Goal)) + { + yield return true; + yield break; + } + } + } + { + object UnqualifiedGoal = arg2; + Variable x1 = new Variable(); + Variable Goal = new Variable(); + foreach (bool l2 in YP.unify(arg1, new Functor2(@"^", x1, Goal))) + { + foreach (bool l3 in unqualifiedGoal(Goal, UnqualifiedGoal)) + { + yield return true; + yield break; + } + } + } + { + Variable UnqualifiedGoal = new Variable(); + foreach (bool l2 in YP.unify(arg1, UnqualifiedGoal)) + { + foreach (bool l3 in YP.unify(arg2, UnqualifiedGoal)) + { + yield return true; + yield break; + } + } + } + } + + public static IEnumerable binaryExpressionConditional(object arg1, object arg2) + { + { + foreach (bool l2 in YP.unify(arg1, Atom.a(@"=:="))) + { + foreach (bool l3 in YP.unify(arg2, Atom.a(@"YP.equal"))) + { + yield return true; + yield break; + } + } + } + { + foreach (bool l2 in YP.unify(arg1, Atom.a(@"=\="))) + { + foreach (bool l3 in YP.unify(arg2, Atom.a(@"YP.notEqual"))) + { + yield return true; + yield break; + } + } + } + { + foreach (bool l2 in YP.unify(arg1, Atom.a(@">"))) + { + foreach (bool l3 in YP.unify(arg2, Atom.a(@"YP.greaterThan"))) + { + yield return true; + yield break; + } + } + } + { + foreach (bool l2 in YP.unify(arg1, Atom.a(@"<"))) + { + foreach (bool l3 in YP.unify(arg2, Atom.a(@"YP.lessThan"))) + { + yield return true; + yield break; + } + } + } + { + foreach (bool l2 in YP.unify(arg1, Atom.a(@">="))) + { + foreach (bool l3 in YP.unify(arg2, Atom.a(@"YP.greaterThanOrEqual"))) + { + yield return true; + yield break; + } + } + } + { + foreach (bool l2 in YP.unify(arg1, Atom.a(@"=<"))) + { + foreach (bool l3 in YP.unify(arg2, Atom.a(@"YP.lessThanOrEqual"))) + { + yield return true; + yield break; + } + } + } + } + + public static IEnumerable compileFunctorCall(object Functor_1, object State, object PseudoCode) + { + { + Variable FunctorName = new Variable(); + Variable FunctorArgs = new Variable(); + Variable x6 = new Variable(); + Variable Arity = new Variable(); + Variable CompiledArgs = new Variable(); + Variable FunctionName = new Variable(); + foreach (bool l2 in YP.univ(Functor_1, new ListPair(FunctorName, FunctorArgs))) + { + foreach (bool l3 in YP.functor(Functor_1, x6, Arity)) + { + foreach (bool l4 in maplist_compileTerm(FunctorArgs, State, CompiledArgs)) + { + foreach (bool l5 in functorCallFunctionName(State, FunctorName, Arity, FunctionName)) + { + if (YP.termEqual(FunctionName, Atom.NIL)) + { + foreach (bool l7 in YP.unify(PseudoCode, new Functor2(@"call", Atom.a(@"YP.matchDynamic"), new ListPair(new Functor2(@"call", Atom.a(@"Atom.a"), new ListPair(new Functor1(@"object", FunctorName), Atom.NIL)), new ListPair(new Functor1(@"objectArray", CompiledArgs), Atom.NIL))))) + { + yield return true; + yield break; + } + goto cutIf1; + } + foreach (bool l6 in YP.unify(PseudoCode, new Functor2(@"call", FunctionName, CompiledArgs))) + { + yield return true; + yield break; + } + cutIf1: + { } + } + } + } + } + } + } + + public static IEnumerable functorCallFunctionName(object arg1, object arg2, object arg3, object arg4) + { + { + object x1 = arg1; + object Name = arg2; + object Arity = arg3; + object FunctionName = arg4; + foreach (bool l2 in functorCallYPFunctionName(Name, Arity, FunctionName)) + { + yield return true; + yield break; + } + } + { + object State = arg1; + object Arity = arg3; + Variable Name = new Variable(); + foreach (bool l2 in YP.unify(arg2, Name)) + { + foreach (bool l3 in YP.unify(arg4, Name)) + { + if (CompilerState.nameArityHasModule(State, Name, Arity, Atom.a(@""))) + { + yield return true; + yield break; + } + } + } + } + { + object _State = arg1; + object _Arity = arg3; + Variable Name = new Variable(); + foreach (bool l2 in YP.unify(arg2, Name)) + { + foreach (bool l3 in YP.unify(arg4, Name)) + { + foreach (bool l4 in Atom.module(Name, Atom.a(@""))) + { + yield return true; + yield break; + } + } + } + } + { + object _State = arg1; + object Name = arg2; + object Arity = arg3; + foreach (bool l2 in YP.unify(arg4, Atom.NIL)) + { + foreach (bool l3 in Atom.module(Name, Atom.NIL)) + { + yield return true; + yield break; + } + } + } + { + object _State = arg1; + object Name = arg2; + object Arity = arg3; + object x4 = arg4; + Variable Module = new Variable(); + Variable Message = new Variable(); + foreach (bool l2 in Atom.module(Name, Module)) + { + foreach (bool l3 in YP.atom_concat(Atom.a(@"Not supporting calls to external module: "), Module, Message)) + { + YP.throwException(new Functor2(@"error", new Functor2(@"type_error", Atom.a(@"callable"), new Functor2(@"/", Name, Arity)), Message)); + yield return true; + yield break; + } + } + } + { + object _State = arg1; + object Name = arg2; + object _Arity = arg3; + object x4 = arg4; + YP.throwException(new Functor2(@"error", new Functor2(@"type_error", Atom.a(@"callable"), Name), Atom.a(@"Term is not callable"))); + yield return true; + yield break; + } + } + + public static IEnumerable functorCallYPFunctionName(object arg1, object arg2, object arg3) + { + { + foreach (bool l2 in YP.unify(arg1, Atom.a(@"="))) + { + foreach (bool l3 in YP.unify(arg2, 2)) + { + foreach (bool l4 in YP.unify(arg3, Atom.a(@"YP.unify"))) + { + yield return true; + yield break; + } + } + } + } + { + foreach (bool l2 in YP.unify(arg1, Atom.a(@"=.."))) + { + foreach (bool l3 in YP.unify(arg2, 2)) + { + foreach (bool l4 in YP.unify(arg3, Atom.a(@"YP.univ"))) + { + yield return true; + yield break; + } + } + } + } + { + foreach (bool l2 in YP.unify(arg1, Atom.a(@"var"))) + { + foreach (bool l3 in YP.unify(arg2, 1)) + { + foreach (bool l4 in YP.unify(arg3, Atom.a(@"YP.var"))) + { + yield return true; + yield break; + } + } + } + } + { + foreach (bool l2 in YP.unify(arg1, Atom.a(@"nonvar"))) + { + foreach (bool l3 in YP.unify(arg2, 1)) + { + foreach (bool l4 in YP.unify(arg3, Atom.a(@"YP.nonvar"))) + { + yield return true; + yield break; + } + } + } + } + { + foreach (bool l2 in YP.unify(arg1, Atom.a(@"arg"))) + { + foreach (bool l3 in YP.unify(arg2, 3)) + { + foreach (bool l4 in YP.unify(arg3, Atom.a(@"YP.arg"))) + { + yield return true; + yield break; + } + } + } + } + { + foreach (bool l2 in YP.unify(arg1, Atom.a(@"functor"))) + { + foreach (bool l3 in YP.unify(arg2, 3)) + { + foreach (bool l4 in YP.unify(arg3, Atom.a(@"YP.functor"))) + { + yield return true; + yield break; + } + } + } + } + { + foreach (bool l2 in YP.unify(arg1, Atom.a(@"repeat"))) + { + foreach (bool l3 in YP.unify(arg2, 0)) + { + foreach (bool l4 in YP.unify(arg3, Atom.a(@"YP.repeat"))) + { + yield return true; + yield break; + } + } + } + } + { + foreach (bool l2 in YP.unify(arg1, Atom.a(@"get_code"))) + { + foreach (bool l3 in YP.unify(arg2, 1)) + { + foreach (bool l4 in YP.unify(arg3, Atom.a(@"YP.get_code"))) + { + yield return true; + yield break; + } + } + } + } + { + foreach (bool l2 in YP.unify(arg1, Atom.a(@"current_op"))) + { + foreach (bool l3 in YP.unify(arg2, 3)) + { + foreach (bool l4 in YP.unify(arg3, Atom.a(@"YP.current_op"))) + { + yield return true; + yield break; + } + } + } + } + { + foreach (bool l2 in YP.unify(arg1, Atom.a(@"atom_length"))) + { + foreach (bool l3 in YP.unify(arg2, 2)) + { + foreach (bool l4 in YP.unify(arg3, Atom.a(@"YP.atom_length"))) + { + yield return true; + yield break; + } + } + } + } + { + foreach (bool l2 in YP.unify(arg1, Atom.a(@"atom_concat"))) + { + foreach (bool l3 in YP.unify(arg2, 3)) + { + foreach (bool l4 in YP.unify(arg3, Atom.a(@"YP.atom_concat"))) + { + yield return true; + yield break; + } + } + } + } + { + foreach (bool l2 in YP.unify(arg1, Atom.a(@"sub_atom"))) + { + foreach (bool l3 in YP.unify(arg2, 5)) + { + foreach (bool l4 in YP.unify(arg3, Atom.a(@"YP.sub_atom"))) + { + yield return true; + yield break; + } + } + } + } + { + foreach (bool l2 in YP.unify(arg1, Atom.a(@"atom_codes"))) + { + foreach (bool l3 in YP.unify(arg2, 2)) + { + foreach (bool l4 in YP.unify(arg3, Atom.a(@"YP.atom_codes"))) + { + yield return true; + yield break; + } + } + } + } + { + foreach (bool l2 in YP.unify(arg1, Atom.a(@"number_codes"))) + { + foreach (bool l3 in YP.unify(arg2, 2)) + { + foreach (bool l4 in YP.unify(arg3, Atom.a(@"YP.number_codes"))) + { + yield return true; + yield break; + } + } + } + } + { + foreach (bool l2 in YP.unify(arg1, Atom.a(@"copy_term"))) + { + foreach (bool l3 in YP.unify(arg2, 2)) + { + foreach (bool l4 in YP.unify(arg3, Atom.a(@"YP.copy_term"))) + { + yield return true; + yield break; + } + } + } + } + { + foreach (bool l2 in YP.unify(arg1, Atom.a(@"sort"))) + { + foreach (bool l3 in YP.unify(arg2, 2)) + { + foreach (bool l4 in YP.unify(arg3, Atom.a(@"YP.sort"))) + { + yield return true; + yield break; + } + } + } + } + { + // Manually included : script_event for callback to LSL/C# + + //object x1 = arg1; + foreach (bool l2 in YP.unify(arg1, Atom.a(@"script_event"))) + { + foreach (bool l3 in YP.unify(arg2, 2)) + { + foreach (bool l4 in YP.unify(arg3, Atom.a(@"YP.script_event"))) + { + yield return true; + yield break; + } + } + } + } + { + foreach (bool l2 in YP.unify(arg1, Atom.a(@"nl"))) + { + foreach (bool l3 in YP.unify(arg2, 0)) + { + foreach (bool l4 in YP.unify(arg3, Atom.a(@"YP.nl"))) + { + yield return true; + yield break; + } + } + } + } + { + foreach (bool l2 in YP.unify(arg1, Atom.a(@"write"))) + { + foreach (bool l3 in YP.unify(arg2, 1)) + { + foreach (bool l4 in YP.unify(arg3, Atom.a(@"YP.write"))) + { + yield return true; + yield break; + } + } + } + } + { + foreach (bool l2 in YP.unify(arg1, Atom.a(@"put_code"))) + { + foreach (bool l3 in YP.unify(arg2, 1)) + { + foreach (bool l4 in YP.unify(arg3, Atom.a(@"YP.put_code"))) + { + yield return true; + yield break; + } + } + } + } + { + foreach (bool l2 in YP.unify(arg1, Atom.a(@"atom"))) + { + foreach (bool l3 in YP.unify(arg2, 1)) + { + foreach (bool l4 in YP.unify(arg3, Atom.a(@"YP.atom"))) + { + yield return true; + yield break; + } + } + } + } + { + foreach (bool l2 in YP.unify(arg1, Atom.a(@"integer"))) + { + foreach (bool l3 in YP.unify(arg2, 1)) + { + foreach (bool l4 in YP.unify(arg3, Atom.a(@"YP.integer"))) + { + yield return true; + yield break; + } + } + } + } + { + foreach (bool l2 in YP.unify(arg1, Atom.a(@"float"))) + { + foreach (bool l3 in YP.unify(arg2, 1)) + { + foreach (bool l4 in YP.unify(arg3, Atom.a(@"YP.isFloat"))) + { + yield return true; + yield break; + } + } + } + } + { + foreach (bool l2 in YP.unify(arg1, Atom.a(@"number"))) + { + foreach (bool l3 in YP.unify(arg2, 1)) + { + foreach (bool l4 in YP.unify(arg3, Atom.a(@"YP.number"))) + { + yield return true; + yield break; + } + } + } + } + { + foreach (bool l2 in YP.unify(arg1, Atom.a(@"atomic"))) + { + foreach (bool l3 in YP.unify(arg2, 1)) + { + foreach (bool l4 in YP.unify(arg3, Atom.a(@"YP.atomic"))) + { + yield return true; + yield break; + } + } + } + } + { + foreach (bool l2 in YP.unify(arg1, Atom.a(@"compound"))) + { + foreach (bool l3 in YP.unify(arg2, 1)) + { + foreach (bool l4 in YP.unify(arg3, Atom.a(@"YP.compound"))) + { + yield return true; + yield break; + } + } + } + } + { + foreach (bool l2 in YP.unify(arg1, Atom.a(@"=="))) + { + foreach (bool l3 in YP.unify(arg2, 2)) + { + foreach (bool l4 in YP.unify(arg3, Atom.a(@"YP.termEqual"))) + { + yield return true; + yield break; + } + } + } + } + { + foreach (bool l2 in YP.unify(arg1, Atom.a(@"\=="))) + { + foreach (bool l3 in YP.unify(arg2, 2)) + { + foreach (bool l4 in YP.unify(arg3, Atom.a(@"YP.termNotEqual"))) + { + yield return true; + yield break; + } + } + } + } + { + foreach (bool l2 in YP.unify(arg1, Atom.a(@"@<"))) + { + foreach (bool l3 in YP.unify(arg2, 2)) + { + foreach (bool l4 in YP.unify(arg3, Atom.a(@"YP.termLessThan"))) + { + yield return true; + yield break; + } + } + } + } + { + foreach (bool l2 in YP.unify(arg1, Atom.a(@"@=<"))) + { + foreach (bool l3 in YP.unify(arg2, 2)) + { + foreach (bool l4 in YP.unify(arg3, Atom.a(@"YP.termLessThanOrEqual"))) + { + yield return true; + yield break; + } + } + } + } + { + foreach (bool l2 in YP.unify(arg1, Atom.a(@"@>"))) + { + foreach (bool l3 in YP.unify(arg2, 2)) + { + foreach (bool l4 in YP.unify(arg3, Atom.a(@"YP.termGreaterThan"))) + { + yield return true; + yield break; + } + } + } + } + { + foreach (bool l2 in YP.unify(arg1, Atom.a(@"@>="))) + { + foreach (bool l3 in YP.unify(arg2, 2)) + { + foreach (bool l4 in YP.unify(arg3, Atom.a(@"YP.termGreaterThanOrEqual"))) + { + yield return true; + yield break; + } + } + } + } + { + foreach (bool l2 in YP.unify(arg1, Atom.a(@"throw"))) + { + foreach (bool l3 in YP.unify(arg2, 1)) + { + foreach (bool l4 in YP.unify(arg3, Atom.a(@"YP.throwException"))) + { + yield return true; + yield break; + } + } + } + } + } + + public static IEnumerable compileTerm(object arg1, object arg2, object arg3) + { + { + object Term = arg1; + object State = arg2; + Variable VariableName = new Variable(); + foreach (bool l2 in YP.unify(arg3, new Functor1(@"var", VariableName))) + { + if (YP.var(Term)) + { + foreach (bool l4 in CompilerState.getVariableName(State, Term, VariableName)) + { + yield return true; + yield break; + } + } + } + } + { + object _State = arg2; + foreach (bool l2 in YP.unify(arg1, Atom.NIL)) + { + foreach (bool l3 in YP.unify(arg3, new Functor1(@"var", Atom.a(@"Atom.NIL")))) + { + yield return true; + yield break; + } + } + } + { + object Term = arg1; + object State = arg2; + object Code = arg3; + Variable ModuleCode = new Variable(); + if (YP.atom(Term)) + { + foreach (bool l3 in compileAtomModule(Term, 0, State, ModuleCode)) + { + foreach (bool l4 in YP.unify(Code, new Functor2(@"call", Atom.a(@"Atom.a"), new ListPair(new Functor1(@"object", Term), new ListPair(ModuleCode, Atom.NIL))))) + { + yield return true; + yield break; + } + goto cutIf1; + } + foreach (bool l3 in YP.unify(Code, new Functor2(@"call", Atom.a(@"Atom.a"), new ListPair(new Functor1(@"object", Term), Atom.NIL)))) + { + yield return true; + yield break; + } + cutIf1: + { } + } + } + { + object State = arg2; + Variable First = new Variable(); + Variable Rest = new Variable(); + Variable Arg1 = new Variable(); + Variable Arg2 = new Variable(); + foreach (bool l2 in YP.unify(arg1, new ListPair(First, Rest))) + { + foreach (bool l3 in YP.unify(arg3, new Functor2(@"new", Atom.a(@"ListPair"), new ListPair(Arg1, new ListPair(Arg2, Atom.NIL))))) + { + foreach (bool l4 in compileTerm(First, State, Arg1)) + { + foreach (bool l5 in compileTerm(Rest, State, Arg2)) + { + yield return true; + yield break; + } + } + } + } + } + { + object Term = arg1; + object State = arg2; + object Result = arg3; + Variable Name = new Variable(); + Variable TermArgs = new Variable(); + Variable x6 = new Variable(); + Variable Arity = new Variable(); + Variable ModuleCode = new Variable(); + Variable NameCode = new Variable(); + Variable X1 = new Variable(); + Variable Arg1 = new Variable(); + Variable X2 = new Variable(); + Variable Arg2 = new Variable(); + Variable X3 = new Variable(); + Variable Arg3 = new Variable(); + Variable Args = new Variable(); + foreach (bool l2 in YP.univ(Term, new ListPair(Name, TermArgs))) + { + if (YP.termEqual(TermArgs, Atom.NIL)) + { + foreach (bool l4 in YP.unify(Result, new Functor1(@"object", Name))) + { + yield return true; + yield break; + } + goto cutIf2; + } + foreach (bool l3 in YP.functor(Term, x6, Arity)) + { + foreach (bool l4 in compileAtomModule(Name, Arity, State, ModuleCode)) + { + foreach (bool l5 in YP.unify(NameCode, new Functor2(@"call", Atom.a(@"Atom.a"), new ListPair(new Functor1(@"object", Name), new ListPair(ModuleCode, Atom.NIL))))) + { + foreach (bool l6 in YP.unify(TermArgs, new ListPair(X1, Atom.NIL))) + { + foreach (bool l7 in compileTerm(X1, State, Arg1)) + { + foreach (bool l8 in YP.unify(Result, new Functor2(@"new", Atom.a(@"Functor1"), new ListPair(NameCode, new ListPair(Arg1, Atom.NIL))))) + { + yield return true; + yield break; + } + } + goto cutIf4; + } + foreach (bool l6 in YP.unify(TermArgs, new ListPair(X1, new ListPair(X2, Atom.NIL)))) + { + foreach (bool l7 in compileTerm(X1, State, Arg1)) + { + foreach (bool l8 in compileTerm(X2, State, Arg2)) + { + foreach (bool l9 in YP.unify(Result, new Functor2(@"new", Atom.a(@"Functor2"), new ListPair(NameCode, new ListPair(Arg1, new ListPair(Arg2, Atom.NIL)))))) + { + yield return true; + yield break; + } + } + } + goto cutIf5; + } + foreach (bool l6 in YP.unify(TermArgs, new ListPair(X1, new ListPair(X2, new ListPair(X3, Atom.NIL))))) + { + foreach (bool l7 in compileTerm(X1, State, Arg1)) + { + foreach (bool l8 in compileTerm(X2, State, Arg2)) + { + foreach (bool l9 in compileTerm(X3, State, Arg3)) + { + foreach (bool l10 in YP.unify(Result, new Functor2(@"new", Atom.a(@"Functor3"), new ListPair(NameCode, new ListPair(Arg1, new ListPair(Arg2, new ListPair(Arg3, Atom.NIL))))))) + { + yield return true; + yield break; + } + } + } + } + } + foreach (bool l6 in maplist_compileTerm(TermArgs, State, Args)) + { + foreach (bool l7 in YP.unify(Result, new Functor2(@"new", Atom.a(@"Functor"), new ListPair(NameCode, new ListPair(new Functor1(@"objectArray", Args), Atom.NIL))))) + { + yield return true; + yield break; + } + } + cutIf5: + cutIf4: + { } + } + goto cutIf3; + } + foreach (bool l4 in YP.unify(NameCode, new Functor1(@"object", Name))) + { + foreach (bool l5 in YP.unify(TermArgs, new ListPair(X1, Atom.NIL))) + { + foreach (bool l6 in compileTerm(X1, State, Arg1)) + { + foreach (bool l7 in YP.unify(Result, new Functor2(@"new", Atom.a(@"Functor1"), new ListPair(NameCode, new ListPair(Arg1, Atom.NIL))))) + { + yield return true; + yield break; + } + } + goto cutIf6; + } + foreach (bool l5 in YP.unify(TermArgs, new ListPair(X1, new ListPair(X2, Atom.NIL)))) + { + foreach (bool l6 in compileTerm(X1, State, Arg1)) + { + foreach (bool l7 in compileTerm(X2, State, Arg2)) + { + foreach (bool l8 in YP.unify(Result, new Functor2(@"new", Atom.a(@"Functor2"), new ListPair(NameCode, new ListPair(Arg1, new ListPair(Arg2, Atom.NIL)))))) + { + yield return true; + yield break; + } + } + } + goto cutIf7; + } + foreach (bool l5 in YP.unify(TermArgs, new ListPair(X1, new ListPair(X2, new ListPair(X3, Atom.NIL))))) + { + foreach (bool l6 in compileTerm(X1, State, Arg1)) + { + foreach (bool l7 in compileTerm(X2, State, Arg2)) + { + foreach (bool l8 in compileTerm(X3, State, Arg3)) + { + foreach (bool l9 in YP.unify(Result, new Functor2(@"new", Atom.a(@"Functor3"), new ListPair(NameCode, new ListPair(Arg1, new ListPair(Arg2, new ListPair(Arg3, Atom.NIL))))))) + { + yield return true; + yield break; + } + } + } + } + } + foreach (bool l5 in maplist_compileTerm(TermArgs, State, Args)) + { + foreach (bool l6 in YP.unify(Result, new Functor2(@"new", Atom.a(@"Functor"), new ListPair(NameCode, new ListPair(new Functor1(@"objectArray", Args), Atom.NIL))))) + { + yield return true; + yield break; + } + } + cutIf7: + cutIf6: + { } + } + cutIf3: + { } + } + cutIf2: + { } + } + } + } + + public static IEnumerable compileAtomModule(object Name, object Arity, object State, object ModuleCode) + { + { + if (CompilerState.nameArityHasModule(State, Name, Arity, Atom.a(@""))) + { + foreach (bool l3 in YP.unify(ModuleCode, new Functor2(@"call", Atom.a(@"Atom.a"), new ListPair(new Functor1(@"object", Atom.a(@"")), Atom.NIL)))) + { + yield return true; + yield break; + } + } + } + } + + public static IEnumerable maplist_compileTerm(object arg1, object arg2, object arg3) + { + { + object _State = arg2; + foreach (bool l2 in YP.unify(arg1, Atom.NIL)) + { + foreach (bool l3 in YP.unify(arg3, Atom.NIL)) + { + yield return true; + yield break; + } + } + } + { + object State = arg2; + Variable First = new Variable(); + Variable Rest = new Variable(); + Variable FirstResult = new Variable(); + Variable RestResults = new Variable(); + foreach (bool l2 in YP.unify(arg1, new ListPair(First, Rest))) + { + foreach (bool l3 in YP.unify(arg3, new ListPair(FirstResult, RestResults))) + { + foreach (bool l4 in compileTerm(First, State, FirstResult)) + { + foreach (bool l5 in maplist_compileTerm(Rest, State, RestResults)) + { + yield return true; + yield break; + } + } + } + } + } + } + + public static IEnumerable compileExpression(object Term, object State, object Result) + { + { + Variable Name = new Variable(); + Variable TermArgs = new Variable(); + Variable X1 = new Variable(); + Variable FunctionName = new Variable(); + Variable Arg1 = new Variable(); + Variable x9 = new Variable(); + Variable X2 = new Variable(); + Variable Arg2 = new Variable(); + Variable x12 = new Variable(); + Variable Arity = new Variable(); + if (YP.nonvar(Term)) + { + foreach (bool l3 in YP.univ(Term, new ListPair(Name, TermArgs))) + { + if (YP.atom(Name)) + { + foreach (bool l5 in YP.unify(TermArgs, new ListPair(X1, Atom.NIL))) + { + foreach (bool l6 in unaryFunction(Name, FunctionName)) + { + foreach (bool l7 in compileExpression(X1, State, Arg1)) + { + foreach (bool l8 in YP.unify(Result, new Functor2(@"call", FunctionName, new ListPair(Arg1, Atom.NIL)))) + { + yield return true; + yield break; + } + } + goto cutIf1; + } + } + foreach (bool l5 in YP.unify(Term, new ListPair(x9, Atom.NIL))) + { + foreach (bool l6 in compileTerm(Term, State, Result)) + { + yield return true; + yield break; + } + goto cutIf2; + } + foreach (bool l5 in YP.unify(TermArgs, new ListPair(X1, new ListPair(X2, Atom.NIL)))) + { + foreach (bool l6 in binaryFunction(Name, FunctionName)) + { + foreach (bool l7 in compileExpression(X1, State, Arg1)) + { + foreach (bool l8 in compileExpression(X2, State, Arg2)) + { + foreach (bool l9 in YP.unify(Result, new Functor2(@"call", FunctionName, new ListPair(Arg1, new ListPair(Arg2, Atom.NIL))))) + { + yield return true; + yield break; + } + } + } + goto cutIf3; + } + } + foreach (bool l5 in YP.functor(Term, x12, Arity)) + { + YP.throwException(new Functor2(@"error", new Functor2(@"type_error", Atom.a(@"evaluable"), new Functor2(@"/", Name, Arity)), Atom.a(@"Not an expression function"))); + yield return false; + } + cutIf3: + cutIf2: + cutIf1: + { } + } + } + } + } + { + foreach (bool l2 in compileTerm(Term, State, Result)) + { + yield return true; + yield break; + } + } + } + + public static IEnumerable unaryFunction(object arg1, object arg2) + { + { + foreach (bool l2 in YP.unify(arg1, Atom.a(@"-"))) + { + foreach (bool l3 in YP.unify(arg2, Atom.a(@"YP.negate"))) + { + yield return true; + yield break; + } + } + } + { + foreach (bool l2 in YP.unify(arg1, Atom.a(@"abs"))) + { + foreach (bool l3 in YP.unify(arg2, Atom.a(@"YP.abs"))) + { + yield return true; + yield break; + } + } + } + { + foreach (bool l2 in YP.unify(arg1, Atom.a(@"sign"))) + { + foreach (bool l3 in YP.unify(arg2, Atom.a(@"YP.sign"))) + { + yield return true; + yield break; + } + } + } + { + foreach (bool l2 in YP.unify(arg1, Atom.a(@"floor"))) + { + foreach (bool l3 in YP.unify(arg2, Atom.a(@"YP.floor"))) + { + yield return true; + yield break; + } + } + } + { + foreach (bool l2 in YP.unify(arg1, Atom.a(@"truncate"))) + { + foreach (bool l3 in YP.unify(arg2, Atom.a(@"YP.truncate"))) + { + yield return true; + yield break; + } + } + } + { + foreach (bool l2 in YP.unify(arg1, Atom.a(@"round"))) + { + foreach (bool l3 in YP.unify(arg2, Atom.a(@"YP.round"))) + { + yield return true; + yield break; + } + } + } + { + foreach (bool l2 in YP.unify(arg1, Atom.a(@"floor"))) + { + foreach (bool l3 in YP.unify(arg2, Atom.a(@"YP.ceiling"))) + { + yield return true; + yield break; + } + } + } + { + foreach (bool l2 in YP.unify(arg1, Atom.a(@"sin"))) + { + foreach (bool l3 in YP.unify(arg2, Atom.a(@"YP.sin"))) + { + yield return true; + yield break; + } + } + } + { + foreach (bool l2 in YP.unify(arg1, Atom.a(@"cos"))) + { + foreach (bool l3 in YP.unify(arg2, Atom.a(@"YP.cos"))) + { + yield return true; + yield break; + } + } + } + { + foreach (bool l2 in YP.unify(arg1, Atom.a(@"atan"))) + { + foreach (bool l3 in YP.unify(arg2, Atom.a(@"YP.atan"))) + { + yield return true; + yield break; + } + } + } + { + foreach (bool l2 in YP.unify(arg1, Atom.a(@"exp"))) + { + foreach (bool l3 in YP.unify(arg2, Atom.a(@"YP.exp"))) + { + yield return true; + yield break; + } + } + } + { + foreach (bool l2 in YP.unify(arg1, Atom.a(@"log"))) + { + foreach (bool l3 in YP.unify(arg2, Atom.a(@"YP.log"))) + { + yield return true; + yield break; + } + } + } + { + foreach (bool l2 in YP.unify(arg1, Atom.a(@"sqrt"))) + { + foreach (bool l3 in YP.unify(arg2, Atom.a(@"YP.sqrt"))) + { + yield return true; + yield break; + } + } + } + { + foreach (bool l2 in YP.unify(arg1, Atom.a(@"\"))) + { + foreach (bool l3 in YP.unify(arg2, Atom.a(@"YP.bitwiseComplement"))) + { + yield return true; + yield break; + } + } + } + } + + public static IEnumerable binaryFunction(object arg1, object arg2) + { + { + foreach (bool l2 in YP.unify(arg1, Atom.a(@"+"))) + { + foreach (bool l3 in YP.unify(arg2, Atom.a(@"YP.add"))) + { + yield return true; + yield break; + } + } + } + { + foreach (bool l2 in YP.unify(arg1, Atom.a(@"-"))) + { + foreach (bool l3 in YP.unify(arg2, Atom.a(@"YP.subtract"))) + { + yield return true; + yield break; + } + } + } + { + foreach (bool l2 in YP.unify(arg1, Atom.a(@"*"))) + { + foreach (bool l3 in YP.unify(arg2, Atom.a(@"YP.multiply"))) + { + yield return true; + yield break; + } + } + } + { + foreach (bool l2 in YP.unify(arg1, Atom.a(@"/"))) + { + foreach (bool l3 in YP.unify(arg2, Atom.a(@"YP.divide"))) + { + yield return true; + yield break; + } + } + } + { + foreach (bool l2 in YP.unify(arg1, Atom.a(@"//"))) + { + foreach (bool l3 in YP.unify(arg2, Atom.a(@"YP.intDivide"))) + { + yield return true; + yield break; + } + } + } + { + foreach (bool l2 in YP.unify(arg1, Atom.a(@"mod"))) + { + foreach (bool l3 in YP.unify(arg2, Atom.a(@"YP.mod"))) + { + yield return true; + yield break; + } + } + } + { + foreach (bool l2 in YP.unify(arg1, Atom.a(@"**"))) + { + foreach (bool l3 in YP.unify(arg2, Atom.a(@"YP.pow"))) + { + yield return true; + yield break; + } + } + } + { + foreach (bool l2 in YP.unify(arg1, Atom.a(@">>"))) + { + foreach (bool l3 in YP.unify(arg2, Atom.a(@"YP.bitwiseShiftRight"))) + { + yield return true; + yield break; + } + } + } + { + foreach (bool l2 in YP.unify(arg1, Atom.a(@"<<"))) + { + foreach (bool l3 in YP.unify(arg2, Atom.a(@"YP.bitwiseShiftLeft"))) + { + yield return true; + yield break; + } + } + } + { + foreach (bool l2 in YP.unify(arg1, Atom.a(@"/\"))) + { + foreach (bool l3 in YP.unify(arg2, Atom.a(@"YP.bitwiseAnd"))) + { + yield return true; + yield break; + } + } + } + { + foreach (bool l2 in YP.unify(arg1, Atom.a(@"\/"))) + { + foreach (bool l3 in YP.unify(arg2, Atom.a(@"YP.bitwiseOr"))) + { + yield return true; + yield break; + } + } + } + { + foreach (bool l2 in YP.unify(arg1, Atom.a(@"min"))) + { + foreach (bool l3 in YP.unify(arg2, Atom.a(@"YP.min"))) + { + yield return true; + yield break; + } + } + } + { + foreach (bool l2 in YP.unify(arg1, Atom.a(@"max"))) + { + foreach (bool l3 in YP.unify(arg2, Atom.a(@"YP.max"))) + { + yield return true; + yield break; + } + } + } + } + + public static void convertFunctionCSharp(object arg1) + { + { + foreach (bool l2 in YP.unify(arg1, Atom.a(@"getDeclaringClass"))) + { + YP.write(Atom.a(@"public class YPInnerClass {}")); + YP.nl(); + YP.write(Atom.a(@"public static System.Type getDeclaringClass() { return typeof(YPInnerClass).DeclaringType; }")); + YP.nl(); + YP.nl(); + return; + } + } + { + Variable ReturnType = new Variable(); + Variable Name = new Variable(); + Variable ArgList = new Variable(); + Variable Body = new Variable(); + Variable Level = new Variable(); + foreach (bool l2 in YP.unify(arg1, new Functor(@"function", new object[] { ReturnType, Name, ArgList, Body }))) + { + YP.write(Atom.a(@"public static ")); + YP.write(ReturnType); + YP.write(Atom.a(@" ")); + YP.write(Name); + YP.write(Atom.a(@"(")); + convertArgListCSharp(ArgList); + YP.write(Atom.a(@") {")); + YP.nl(); + foreach (bool l3 in YP.unify(Level, 1)) + { + convertStatementListCSharp(Body, Level); + YP.write(Atom.a(@"}")); + YP.nl(); + YP.nl(); + return; + } + } + } + } + + public static IEnumerable convertStatementListCSharp(object arg1, object x1, object x2) + { + { + foreach (bool l2 in YP.unify(arg1, Atom.NIL)) + { + yield return true; + yield break; + } + } + } + + public static void convertStatementListCSharp(object arg1, object Level) + { + { + Variable Name = new Variable(); + Variable Body = new Variable(); + Variable RestStatements = new Variable(); + Variable NewStatements = new Variable(); + foreach (bool l2 in YP.unify(arg1, new ListPair(new Functor2(@"breakableBlock", Name, Body), RestStatements))) + { + foreach (bool l3 in append(Body, new ListPair(new Functor1(@"label", Name), RestStatements), NewStatements)) + { + convertStatementListCSharp(NewStatements, Level); + return; + } + } + } + { + Variable Type = new Variable(); + Variable Name = new Variable(); + Variable Expression = new Variable(); + Variable RestStatements = new Variable(); + foreach (bool l2 in YP.unify(arg1, new ListPair(new Functor3(@"declare", Type, Name, Expression), RestStatements))) + { + convertIndentationCSharp(Level); + YP.write(Type); + YP.write(Atom.a(@" ")); + YP.write(Name); + YP.write(Atom.a(@" = ")); + convertExpressionCSharp(Expression); + YP.write(Atom.a(@";")); + YP.nl(); + convertStatementListCSharp(RestStatements, Level); + return; + } + } + { + Variable Name = new Variable(); + Variable Expression = new Variable(); + Variable RestStatements = new Variable(); + foreach (bool l2 in YP.unify(arg1, new ListPair(new Functor2(@"assign", Name, Expression), RestStatements))) + { + convertIndentationCSharp(Level); + YP.write(Name); + YP.write(Atom.a(@" = ")); + convertExpressionCSharp(Expression); + YP.write(Atom.a(@";")); + YP.nl(); + convertStatementListCSharp(RestStatements, Level); + return; + } + } + { + Variable RestStatements = new Variable(); + foreach (bool l2 in YP.unify(arg1, new ListPair(Atom.a(@"yieldtrue"), RestStatements))) + { + convertIndentationCSharp(Level); + YP.write(Atom.a(@"yield return true;")); + YP.nl(); + convertStatementListCSharp(RestStatements, Level); + return; + } + } + { + Variable RestStatements = new Variable(); + foreach (bool l2 in YP.unify(arg1, new ListPair(Atom.a(@"yieldfalse"), RestStatements))) + { + convertIndentationCSharp(Level); + YP.write(Atom.a(@"yield return false;")); + YP.nl(); + convertStatementListCSharp(RestStatements, Level); + return; + } + } + { + Variable RestStatements = new Variable(); + foreach (bool l2 in YP.unify(arg1, new ListPair(Atom.a(@"yieldbreak"), RestStatements))) + { + convertIndentationCSharp(Level); + YP.write(Atom.a(@"yield break;")); + YP.nl(); + convertStatementListCSharp(RestStatements, Level); + return; + } + } + { + Variable RestStatements = new Variable(); + foreach (bool l2 in YP.unify(arg1, new ListPair(Atom.a(@"return"), RestStatements))) + { + convertIndentationCSharp(Level); + YP.write(Atom.a(@"return;")); + YP.nl(); + convertStatementListCSharp(RestStatements, Level); + return; + } + } + { + Variable RestStatements = new Variable(); + foreach (bool l2 in YP.unify(arg1, new ListPair(Atom.a(@"returntrue"), RestStatements))) + { + convertIndentationCSharp(Level); + YP.write(Atom.a(@"return true;")); + YP.nl(); + convertStatementListCSharp(RestStatements, Level); + return; + } + } + { + Variable RestStatements = new Variable(); + foreach (bool l2 in YP.unify(arg1, new ListPair(Atom.a(@"returnfalse"), RestStatements))) + { + convertIndentationCSharp(Level); + YP.write(Atom.a(@"return false;")); + YP.nl(); + convertStatementListCSharp(RestStatements, Level); + return; + } + } + { + Variable Name = new Variable(); + Variable RestStatements = new Variable(); + foreach (bool l2 in YP.unify(arg1, new ListPair(new Functor1(@"label", Name), RestStatements))) + { + convertIndentationCSharp(Level); + YP.write(Name); + YP.write(Atom.a(@":")); + YP.nl(); + if (YP.termEqual(RestStatements, Atom.NIL)) + { + convertIndentationCSharp(Level); + YP.write(Atom.a(@"{}")); + YP.nl(); + convertStatementListCSharp(RestStatements, Level); + return; + goto cutIf1; + } + convertStatementListCSharp(RestStatements, Level); + return; + cutIf1: + { } + } + } + { + Variable Name = new Variable(); + Variable RestStatements = new Variable(); + foreach (bool l2 in YP.unify(arg1, new ListPair(new Functor1(@"breakBlock", Name), RestStatements))) + { + convertIndentationCSharp(Level); + YP.write(Atom.a(@"goto ")); + YP.write(Name); + YP.write(Atom.a(@";")); + YP.nl(); + convertStatementListCSharp(RestStatements, Level); + return; + } + } + { + Variable Name = new Variable(); + Variable ArgList = new Variable(); + Variable RestStatements = new Variable(); + foreach (bool l2 in YP.unify(arg1, new ListPair(new Functor2(@"call", Name, ArgList), RestStatements))) + { + convertIndentationCSharp(Level); + YP.write(Name); + YP.write(Atom.a(@"(")); + convertArgListCSharp(ArgList); + YP.write(Atom.a(@");")); + YP.nl(); + convertStatementListCSharp(RestStatements, Level); + return; + } + } + { + Variable Obj = new Variable(); + Variable Name = new Variable(); + Variable ArgList = new Variable(); + Variable RestStatements = new Variable(); + foreach (bool l2 in YP.unify(arg1, new ListPair(new Functor3(@"callMember", new Functor1(@"var", Obj), Name, ArgList), RestStatements))) + { + convertIndentationCSharp(Level); + YP.write(Obj); + YP.write(Atom.a(@".")); + YP.write(Name); + YP.write(Atom.a(@"(")); + convertArgListCSharp(ArgList); + YP.write(Atom.a(@");")); + YP.nl(); + convertStatementListCSharp(RestStatements, Level); + return; + } + } + { + Variable Body = new Variable(); + Variable RestStatements = new Variable(); + Variable NextLevel = new Variable(); + foreach (bool l2 in YP.unify(arg1, new ListPair(new Functor1(@"blockScope", Body), RestStatements))) + { + convertIndentationCSharp(Level); + YP.write(Atom.a(@"{")); + YP.nl(); + foreach (bool l3 in YP.unify(NextLevel, YP.add(Level, 1))) + { + convertStatementListCSharp(Body, NextLevel); + convertIndentationCSharp(Level); + YP.write(Atom.a(@"}")); + YP.nl(); + convertStatementListCSharp(RestStatements, Level); + return; + } + } + } + { + Variable Expression = new Variable(); + Variable Body = new Variable(); + Variable RestStatements = new Variable(); + Variable NextLevel = new Variable(); + foreach (bool l2 in YP.unify(arg1, new ListPair(new Functor2(@"if", Expression, Body), RestStatements))) + { + convertIndentationCSharp(Level); + YP.write(Atom.a(@"if (")); + convertExpressionCSharp(Expression); + YP.write(Atom.a(@") {")); + YP.nl(); + foreach (bool l3 in YP.unify(NextLevel, YP.add(Level, 1))) + { + convertStatementListCSharp(Body, NextLevel); + convertIndentationCSharp(Level); + YP.write(Atom.a(@"}")); + YP.nl(); + convertStatementListCSharp(RestStatements, Level); + return; + } + } + } + { + Variable Expression = new Variable(); + Variable Body = new Variable(); + Variable RestStatements = new Variable(); + Variable NextLevel = new Variable(); + foreach (bool l2 in YP.unify(arg1, new ListPair(new Functor2(@"foreach", Expression, Body), RestStatements))) + { + convertIndentationCSharp(Level); + YP.write(Atom.a(@"foreach (bool l")); + YP.write(Level); + YP.write(Atom.a(@" in ")); + convertExpressionCSharp(Expression); + YP.write(Atom.a(@") {")); + YP.nl(); + foreach (bool l3 in YP.unify(NextLevel, YP.add(Level, 1))) + { + convertStatementListCSharp(Body, NextLevel); + convertIndentationCSharp(Level); + YP.write(Atom.a(@"}")); + YP.nl(); + convertStatementListCSharp(RestStatements, Level); + return; + } + } + } + { + Variable Expression = new Variable(); + Variable RestStatements = new Variable(); + foreach (bool l2 in YP.unify(arg1, new ListPair(new Functor1(@"throw", Expression), RestStatements))) + { + convertIndentationCSharp(Level); + YP.write(Atom.a(@"throw ")); + convertExpressionCSharp(Expression); + YP.write(Atom.a(@";")); + YP.nl(); + convertStatementListCSharp(RestStatements, Level); + return; + } + } + } + + public static void convertIndentationCSharp(object Level) + { + { + Variable N = new Variable(); + foreach (bool l2 in YP.unify(N, YP.multiply(Level, 2))) + { + repeatWrite(Atom.a(@" "), N); + return; + } + } + } + + public static void convertArgListCSharp(object arg1) + { + { + foreach (bool l2 in YP.unify(arg1, Atom.NIL)) + { + return; + } + } + { + Variable Head = new Variable(); + Variable Tail = new Variable(); + foreach (bool l2 in YP.unify(arg1, new ListPair(Head, Tail))) + { + convertExpressionCSharp(Head); + if (YP.termNotEqual(Tail, Atom.NIL)) + { + YP.write(Atom.a(@", ")); + convertArgListCSharp(Tail); + return; + goto cutIf1; + } + convertArgListCSharp(Tail); + return; + cutIf1: + { } + } + } + } + + public static void convertExpressionCSharp(object arg1) + { + { + Variable X = new Variable(); + foreach (bool l2 in YP.unify(arg1, new Functor1(@"arg", X))) + { + YP.write(Atom.a(@"object ")); + YP.write(X); + return; + } + } + { + Variable Name = new Variable(); + Variable ArgList = new Variable(); + foreach (bool l2 in YP.unify(arg1, new Functor2(@"call", Name, ArgList))) + { + YP.write(Name); + YP.write(Atom.a(@"(")); + convertArgListCSharp(ArgList); + YP.write(Atom.a(@")")); + return; + } + } + { + Variable Obj = new Variable(); + Variable Name = new Variable(); + Variable ArgList = new Variable(); + foreach (bool l2 in YP.unify(arg1, new Functor3(@"callMember", new Functor1(@"var", Obj), Name, ArgList))) + { + YP.write(Obj); + YP.write(Atom.a(@".")); + YP.write(Name); + YP.write(Atom.a(@"(")); + convertArgListCSharp(ArgList); + YP.write(Atom.a(@")")); + return; + } + } + { + Variable Name = new Variable(); + Variable ArgList = new Variable(); + foreach (bool l2 in YP.unify(arg1, new Functor2(@"new", Name, ArgList))) + { + YP.write(Atom.a(@"new ")); + YP.write(Name); + YP.write(Atom.a(@"(")); + convertArgListCSharp(ArgList); + YP.write(Atom.a(@")")); + return; + } + } + { + Variable Name = new Variable(); + foreach (bool l2 in YP.unify(arg1, new Functor1(@"var", Name))) + { + YP.write(Name); + return; + } + } + { + foreach (bool l2 in YP.unify(arg1, Atom.a(@"null"))) + { + YP.write(Atom.a(@"null")); + return; + } + } + { + Variable X = new Variable(); + foreach (bool l2 in YP.unify(arg1, new Functor1(@"not", X))) + { + YP.write(Atom.a(@"!(")); + convertExpressionCSharp(X); + YP.write(Atom.a(@")")); + return; + } + } + { + Variable X = new Variable(); + Variable Y = new Variable(); + foreach (bool l2 in YP.unify(arg1, new Functor2(@"and", X, Y))) + { + YP.write(Atom.a(@"(")); + convertExpressionCSharp(X); + YP.write(Atom.a(@") && (")); + convertExpressionCSharp(Y); + YP.write(Atom.a(@")")); + return; + } + } + { + Variable ArgList = new Variable(); + foreach (bool l2 in YP.unify(arg1, new Functor1(@"objectArray", ArgList))) + { + YP.write(Atom.a(@"new object[] {")); + convertArgListCSharp(ArgList); + YP.write(Atom.a(@"}")); + return; + } + } + { + Variable X = new Variable(); + Variable Codes = new Variable(); + foreach (bool l2 in YP.unify(arg1, new Functor1(@"object", X))) + { + if (YP.atom(X)) + { + YP.write(Atom.a(@"@""")); + foreach (bool l4 in YP.atom_codes(X, Codes)) + { + convertStringCodesCSharp(Codes); + YP.write(Atom.a(@"""")); + return; + } + } + } + } + { + Variable X = new Variable(); + foreach (bool l2 in YP.unify(arg1, new Functor1(@"object", X))) + { + YP.write(X); + return; + } + } + } + + public static void convertStringCodesCSharp(object arg1) + { + { + foreach (bool l2 in YP.unify(arg1, Atom.NIL)) + { + return; + } + } + { + Variable Code = new Variable(); + Variable RestCodes = new Variable(); + foreach (bool l2 in YP.unify(arg1, new ListPair(Code, RestCodes))) + { + if (YP.termEqual(Code, 34)) + { + YP.put_code(34); + YP.put_code(Code); + convertStringCodesCSharp(RestCodes); + return; + goto cutIf1; + } + YP.put_code(Code); + convertStringCodesCSharp(RestCodes); + return; + cutIf1: + { } + } + } + } + + public static void convertFunctionJavascript(object arg1) + { + { + foreach (bool l2 in YP.unify(arg1, Atom.a(@"getDeclaringClass"))) + { + YP.write(Atom.a(@"function getDeclaringClass() { return null; }")); + YP.nl(); + return; + } + } + { + Variable x1 = new Variable(); + Variable Name = new Variable(); + Variable ArgList = new Variable(); + Variable Body = new Variable(); + foreach (bool l2 in YP.unify(arg1, new Functor(@"function", new object[] { x1, Name, ArgList, Body }))) + { + YP.write(Atom.a(@"function ")); + YP.write(Name); + YP.write(Atom.a(@"(")); + convertArgListJavascript(ArgList); + YP.write(Atom.a(@") {")); + YP.nl(); + convertStatementListJavascript(Body, 1); + YP.write(Atom.a(@"}")); + YP.nl(); + YP.nl(); + return; + } + } + } + + public static void convertStatementListJavascript(object arg1, object arg2) + { + { + object x1 = arg2; + foreach (bool l2 in YP.unify(arg1, Atom.NIL)) + { + return; + } + } + { + object Level = arg2; + Variable Name = new Variable(); + Variable Body = new Variable(); + Variable RestStatements = new Variable(); + Variable NextLevel = new Variable(); + foreach (bool l2 in YP.unify(arg1, new ListPair(new Functor2(@"breakableBlock", Name, Body), RestStatements))) + { + convertIndentationJavascript(Level); + YP.write(Name); + YP.write(Atom.a(@":")); + YP.nl(); + convertIndentationJavascript(Level); + YP.write(Atom.a(@"{")); + YP.nl(); + foreach (bool l3 in YP.unify(NextLevel, YP.add(Level, 1))) + { + convertStatementListJavascript(Body, NextLevel); + convertIndentationJavascript(Level); + YP.write(Atom.a(@"}")); + YP.nl(); + convertStatementListJavascript(RestStatements, Level); + return; + } + } + } + { + object Level = arg2; + Variable _Type = new Variable(); + Variable Name = new Variable(); + Variable Expression = new Variable(); + Variable RestStatements = new Variable(); + foreach (bool l2 in YP.unify(arg1, new ListPair(new Functor3(@"declare", _Type, Name, Expression), RestStatements))) + { + convertIndentationJavascript(Level); + YP.write(Atom.a(@"var ")); + YP.write(Name); + YP.write(Atom.a(@" = ")); + convertExpressionJavascript(Expression); + YP.write(Atom.a(@";")); + YP.nl(); + convertStatementListJavascript(RestStatements, Level); + return; + } + } + { + object Level = arg2; + Variable Name = new Variable(); + Variable Expression = new Variable(); + Variable RestStatements = new Variable(); + foreach (bool l2 in YP.unify(arg1, new ListPair(new Functor2(@"assign", Name, Expression), RestStatements))) + { + convertIndentationJavascript(Level); + YP.write(Name); + YP.write(Atom.a(@" = ")); + convertExpressionJavascript(Expression); + YP.write(Atom.a(@";")); + YP.nl(); + convertStatementListJavascript(RestStatements, Level); + return; + } + } + { + object Level = arg2; + Variable RestStatements = new Variable(); + foreach (bool l2 in YP.unify(arg1, new ListPair(Atom.a(@"yieldtrue"), RestStatements))) + { + convertIndentationJavascript(Level); + YP.write(Atom.a(@"yield true;")); + YP.nl(); + convertStatementListJavascript(RestStatements, Level); + return; + } + } + { + object Level = arg2; + Variable RestStatements = new Variable(); + foreach (bool l2 in YP.unify(arg1, new ListPair(Atom.a(@"yieldfalse"), RestStatements))) + { + convertIndentationJavascript(Level); + YP.write(Atom.a(@"yield false;")); + YP.nl(); + convertStatementListJavascript(RestStatements, Level); + return; + } + } + { + object Level = arg2; + Variable RestStatements = new Variable(); + foreach (bool l2 in YP.unify(arg1, new ListPair(Atom.a(@"yieldbreak"), RestStatements))) + { + convertIndentationJavascript(Level); + YP.write(Atom.a(@"return;")); + YP.nl(); + convertStatementListJavascript(RestStatements, Level); + return; + } + } + { + object Level = arg2; + Variable RestStatements = new Variable(); + foreach (bool l2 in YP.unify(arg1, new ListPair(Atom.a(@"return"), RestStatements))) + { + convertIndentationJavascript(Level); + YP.write(Atom.a(@"return;")); + YP.nl(); + convertStatementListJavascript(RestStatements, Level); + return; + } + } + { + object Level = arg2; + Variable RestStatements = new Variable(); + foreach (bool l2 in YP.unify(arg1, new ListPair(Atom.a(@"returntrue"), RestStatements))) + { + convertIndentationJavascript(Level); + YP.write(Atom.a(@"return true;")); + YP.nl(); + convertStatementListJavascript(RestStatements, Level); + return; + } + } + { + object Level = arg2; + Variable RestStatements = new Variable(); + foreach (bool l2 in YP.unify(arg1, new ListPair(Atom.a(@"returnfalse"), RestStatements))) + { + convertIndentationJavascript(Level); + YP.write(Atom.a(@"return false;")); + YP.nl(); + convertStatementListJavascript(RestStatements, Level); + return; + } + } + { + object Level = arg2; + Variable Name = new Variable(); + Variable RestStatements = new Variable(); + foreach (bool l2 in YP.unify(arg1, new ListPair(new Functor1(@"breakBlock", Name), RestStatements))) + { + convertIndentationJavascript(Level); + YP.write(Atom.a(@"break ")); + YP.write(Name); + YP.write(Atom.a(@";")); + YP.nl(); + convertStatementListJavascript(RestStatements, Level); + return; + } + } + { + object Level = arg2; + Variable Name = new Variable(); + Variable ArgList = new Variable(); + Variable RestStatements = new Variable(); + foreach (bool l2 in YP.unify(arg1, new ListPair(new Functor2(@"call", Name, ArgList), RestStatements))) + { + convertIndentationJavascript(Level); + YP.write(Name); + YP.write(Atom.a(@"(")); + convertArgListJavascript(ArgList); + YP.write(Atom.a(@");")); + YP.nl(); + convertStatementListJavascript(RestStatements, Level); + return; + } + } + { + object Level = arg2; + Variable Obj = new Variable(); + Variable Name = new Variable(); + Variable ArgList = new Variable(); + Variable RestStatements = new Variable(); + foreach (bool l2 in YP.unify(arg1, new ListPair(new Functor3(@"callMember", new Functor1(@"var", Obj), Name, ArgList), RestStatements))) + { + convertIndentationJavascript(Level); + YP.write(Obj); + YP.write(Atom.a(@".")); + YP.write(Name); + YP.write(Atom.a(@"(")); + convertArgListJavascript(ArgList); + YP.write(Atom.a(@");")); + YP.nl(); + convertStatementListJavascript(RestStatements, Level); + return; + } + } + { + object Level = arg2; + Variable Body = new Variable(); + Variable RestStatements = new Variable(); + Variable NextLevel = new Variable(); + foreach (bool l2 in YP.unify(arg1, new ListPair(new Functor1(@"blockScope", Body), RestStatements))) + { + convertIndentationJavascript(Level); + YP.write(Atom.a(@"{")); + YP.nl(); + foreach (bool l3 in YP.unify(NextLevel, YP.add(Level, 1))) + { + convertStatementListJavascript(Body, NextLevel); + convertIndentationJavascript(Level); + YP.write(Atom.a(@"}")); + YP.nl(); + convertStatementListJavascript(RestStatements, Level); + return; + } + } + } + { + object Level = arg2; + Variable Expression = new Variable(); + Variable Body = new Variable(); + Variable RestStatements = new Variable(); + Variable NextLevel = new Variable(); + foreach (bool l2 in YP.unify(arg1, new ListPair(new Functor2(@"if", Expression, Body), RestStatements))) + { + convertIndentationJavascript(Level); + YP.write(Atom.a(@"if (")); + convertExpressionJavascript(Expression); + YP.write(Atom.a(@") {")); + YP.nl(); + foreach (bool l3 in YP.unify(NextLevel, YP.add(Level, 1))) + { + convertStatementListJavascript(Body, NextLevel); + convertIndentationJavascript(Level); + YP.write(Atom.a(@"}")); + YP.nl(); + convertStatementListJavascript(RestStatements, Level); + return; + } + } + } + { + object Level = arg2; + Variable Expression = new Variable(); + Variable Body = new Variable(); + Variable RestStatements = new Variable(); + Variable NextLevel = new Variable(); + foreach (bool l2 in YP.unify(arg1, new ListPair(new Functor2(@"foreach", Expression, Body), RestStatements))) + { + convertIndentationJavascript(Level); + YP.write(Atom.a(@"for each (var l")); + YP.write(Level); + YP.write(Atom.a(@" in ")); + convertExpressionJavascript(Expression); + YP.write(Atom.a(@") {")); + YP.nl(); + foreach (bool l3 in YP.unify(NextLevel, YP.add(Level, 1))) + { + convertStatementListJavascript(Body, NextLevel); + convertIndentationJavascript(Level); + YP.write(Atom.a(@"}")); + YP.nl(); + convertStatementListJavascript(RestStatements, Level); + return; + } + } + } + { + object Level = arg2; + Variable Expression = new Variable(); + Variable RestStatements = new Variable(); + foreach (bool l2 in YP.unify(arg1, new ListPair(new Functor1(@"throw", Expression), RestStatements))) + { + convertIndentationJavascript(Level); + YP.write(Atom.a(@"throw ")); + convertExpressionJavascript(Expression); + YP.write(Atom.a(@";")); + YP.nl(); + convertStatementListJavascript(RestStatements, Level); + return; + } + } + } + + public static void convertIndentationJavascript(object Level) + { + { + Variable N = new Variable(); + foreach (bool l2 in YP.unify(N, YP.multiply(Level, 2))) + { + repeatWrite(Atom.a(@" "), N); + return; + } + } + } + + public static void convertArgListJavascript(object arg1) + { + { + foreach (bool l2 in YP.unify(arg1, Atom.NIL)) + { + return; + } + } + { + Variable Head = new Variable(); + Variable Tail = new Variable(); + foreach (bool l2 in YP.unify(arg1, new ListPair(Head, Tail))) + { + convertExpressionJavascript(Head); + if (YP.termNotEqual(Tail, Atom.NIL)) + { + YP.write(Atom.a(@", ")); + convertArgListJavascript(Tail); + return; + goto cutIf1; + } + convertArgListJavascript(Tail); + return; + cutIf1: + { } + } + } + } + + public static void convertExpressionJavascript(object arg1) + { + { + Variable X = new Variable(); + foreach (bool l2 in YP.unify(arg1, new Functor1(@"arg", X))) + { + YP.write(X); + return; + } + } + { + Variable Name = new Variable(); + Variable ArgList = new Variable(); + foreach (bool l2 in YP.unify(arg1, new Functor2(@"call", Name, ArgList))) + { + YP.write(Name); + YP.write(Atom.a(@"(")); + convertArgListJavascript(ArgList); + YP.write(Atom.a(@")")); + return; + } + } + { + Variable Obj = new Variable(); + Variable Name = new Variable(); + Variable ArgList = new Variable(); + foreach (bool l2 in YP.unify(arg1, new Functor3(@"callMember", new Functor1(@"var", Obj), Name, ArgList))) + { + YP.write(Obj); + YP.write(Atom.a(@".")); + YP.write(Name); + YP.write(Atom.a(@"(")); + convertArgListJavascript(ArgList); + YP.write(Atom.a(@")")); + return; + } + } + { + Variable Name = new Variable(); + Variable ArgList = new Variable(); + foreach (bool l2 in YP.unify(arg1, new Functor2(@"new", Name, ArgList))) + { + YP.write(Atom.a(@"new ")); + YP.write(Name); + YP.write(Atom.a(@"(")); + convertArgListJavascript(ArgList); + YP.write(Atom.a(@")")); + return; + } + } + { + Variable Name = new Variable(); + foreach (bool l2 in YP.unify(arg1, new Functor1(@"var", Name))) + { + YP.write(Name); + return; + } + } + { + foreach (bool l2 in YP.unify(arg1, Atom.a(@"null"))) + { + YP.write(Atom.a(@"null")); + return; + } + } + { + Variable X = new Variable(); + foreach (bool l2 in YP.unify(arg1, new Functor1(@"not", X))) + { + YP.write(Atom.a(@"!(")); + convertExpressionJavascript(X); + YP.write(Atom.a(@")")); + return; + } + } + { + Variable X = new Variable(); + Variable Y = new Variable(); + foreach (bool l2 in YP.unify(arg1, new Functor2(@"and", X, Y))) + { + YP.write(Atom.a(@"(")); + convertExpressionJavascript(X); + YP.write(Atom.a(@") && (")); + convertExpressionJavascript(Y); + YP.write(Atom.a(@")")); + return; + } + } + { + Variable ArgList = new Variable(); + foreach (bool l2 in YP.unify(arg1, new Functor1(@"objectArray", ArgList))) + { + YP.write(Atom.a(@"[")); + convertArgListJavascript(ArgList); + YP.write(Atom.a(@"]")); + return; + } + } + { + Variable X = new Variable(); + Variable Codes = new Variable(); + foreach (bool l2 in YP.unify(arg1, new Functor1(@"object", X))) + { + if (YP.atom(X)) + { + YP.write(Atom.a(@"""")); + foreach (bool l4 in YP.atom_codes(X, Codes)) + { + convertStringCodesJavascript(Codes); + YP.write(Atom.a(@"""")); + return; + } + } + } + } + { + Variable X = new Variable(); + foreach (bool l2 in YP.unify(arg1, new Functor1(@"object", X))) + { + YP.write(X); + return; + } + } + } + + public static void convertStringCodesJavascript(object arg1) + { + { + foreach (bool l2 in YP.unify(arg1, Atom.NIL)) + { + return; + } + } + { + Variable Code = new Variable(); + Variable RestCodes = new Variable(); + foreach (bool l2 in YP.unify(arg1, new ListPair(Code, RestCodes))) + { + if (YP.termEqual(Code, 34)) + { + YP.put_code(92); + YP.put_code(Code); + convertStringCodesJavascript(RestCodes); + return; + goto cutIf1; + } + if (YP.termEqual(Code, 92)) + { + YP.put_code(92); + YP.put_code(Code); + convertStringCodesJavascript(RestCodes); + return; + goto cutIf1; + } + YP.put_code(Code); + convertStringCodesJavascript(RestCodes); + return; + cutIf1: + { } + } + } + } + + public static void convertFunctionPython(object arg1) + { + { + foreach (bool l2 in YP.unify(arg1, Atom.a(@"getDeclaringClass"))) + { + YP.write(Atom.a(@"def getDeclaringClass():")); + YP.nl(); + YP.write(Atom.a(@" return None")); + YP.nl(); + YP.nl(); + return; + } + } + { + Variable x1 = new Variable(); + Variable Name = new Variable(); + Variable ArgList = new Variable(); + Variable Body = new Variable(); + Variable Level = new Variable(); + Variable HasBreakableBlock = new Variable(); + foreach (bool l2 in YP.unify(arg1, new Functor(@"function", new object[] { x1, Name, ArgList, Body }))) + { + YP.write(Atom.a(@"def ")); + YP.write(Name); + YP.write(Atom.a(@"(")); + convertArgListPython(ArgList); + YP.write(Atom.a(@"):")); + YP.nl(); + foreach (bool l3 in YP.unify(Level, 1)) + { + if (hasBreakableBlockPython(Body)) + { + foreach (bool l5 in YP.unify(HasBreakableBlock, 1)) + { + if (YP.termEqual(HasBreakableBlock, 1)) + { + convertIndentationPython(Level); + YP.write(Atom.a(@"doBreak = False")); + YP.nl(); + foreach (bool l7 in convertStatementListPython(Body, Level, HasBreakableBlock)) + { + YP.nl(); + return; + } + goto cutIf2; + } + foreach (bool l6 in convertStatementListPython(Body, Level, HasBreakableBlock)) + { + YP.nl(); + return; + } + cutIf2: + { } + } + goto cutIf1; + } + foreach (bool l4 in YP.unify(HasBreakableBlock, 0)) + { + if (YP.termEqual(HasBreakableBlock, 1)) + { + convertIndentationPython(Level); + YP.write(Atom.a(@"doBreak = False")); + YP.nl(); + foreach (bool l6 in convertStatementListPython(Body, Level, HasBreakableBlock)) + { + YP.nl(); + return; + } + goto cutIf3; + } + foreach (bool l5 in convertStatementListPython(Body, Level, HasBreakableBlock)) + { + YP.nl(); + return; + } + cutIf3: + { } + } + cutIf1: + { } + } + } + } + } + + public static bool hasBreakableBlockPython(object arg1) + { + { + Variable _Name = new Variable(); + Variable _Body = new Variable(); + Variable _RestStatements = new Variable(); + foreach (bool l2 in YP.unify(arg1, new ListPair(new Functor2(@"breakableBlock", _Name, _Body), _RestStatements))) + { + return true; + } + } + { + Variable Body = new Variable(); + Variable _RestStatements = new Variable(); + foreach (bool l2 in YP.unify(arg1, new ListPair(new Functor1(@"blockScope", Body), _RestStatements))) + { + if (hasBreakableBlockPython(Body)) + { + return true; + } + } + } + { + Variable _Expression = new Variable(); + Variable Body = new Variable(); + Variable _RestStatements = new Variable(); + foreach (bool l2 in YP.unify(arg1, new ListPair(new Functor2(@"if", _Expression, Body), _RestStatements))) + { + if (hasBreakableBlockPython(Body)) + { + return true; + } + } + } + { + Variable _Expression = new Variable(); + Variable Body = new Variable(); + Variable _RestStatements = new Variable(); + foreach (bool l2 in YP.unify(arg1, new ListPair(new Functor2(@"foreach", _Expression, Body), _RestStatements))) + { + if (hasBreakableBlockPython(Body)) + { + return true; + } + } + } + { + Variable x1 = new Variable(); + Variable RestStatements = new Variable(); + foreach (bool l2 in YP.unify(arg1, new ListPair(x1, RestStatements))) + { + if (hasBreakableBlockPython(RestStatements)) + { + return true; + } + } + } + return false; + } + + public static IEnumerable convertStatementListPython(object arg1, object arg2, object arg3) + { + { + object x1 = arg2; + object x2 = arg3; + foreach (bool l2 in YP.unify(arg1, Atom.NIL)) + { + yield return true; + yield break; + } + } + { + object Level = arg2; + object HasBreakableBlock = arg3; + Variable Name = new Variable(); + Variable Body = new Variable(); + Variable RestStatements = new Variable(); + Variable NextLevel = new Variable(); + foreach (bool l2 in YP.unify(arg1, new ListPair(new Functor2(@"breakableBlock", Name, Body), RestStatements))) + { + convertIndentationPython(Level); + YP.write(Name); + YP.write(Atom.a(@" = False")); + YP.nl(); + convertIndentationPython(Level); + YP.write(Atom.a(@"for _ in [1]:")); + YP.nl(); + foreach (bool l3 in YP.unify(NextLevel, YP.add(Level, 1))) + { + foreach (bool l4 in convertStatementListPython(Body, NextLevel, HasBreakableBlock)) + { + convertIndentationPython(Level); + YP.write(Atom.a(@"if ")); + YP.write(Name); + YP.write(Atom.a(@":")); + YP.nl(); + convertIndentationPython(NextLevel); + YP.write(Atom.a(@"doBreak = False")); + YP.nl(); + convertIndentationPython(Level); + YP.write(Atom.a(@"if doBreak:")); + YP.nl(); + convertIndentationPython(NextLevel); + YP.write(Atom.a(@"break")); + YP.nl(); + foreach (bool l5 in convertStatementListPython(RestStatements, Level, HasBreakableBlock)) + { + yield return true; + yield break; + } + } + } + } + } + { + object Level = arg2; + object HasBreakableBlock = arg3; + Variable _Type = new Variable(); + Variable Name = new Variable(); + Variable Expression = new Variable(); + Variable RestStatements = new Variable(); + foreach (bool l2 in YP.unify(arg1, new ListPair(new Functor3(@"declare", _Type, Name, Expression), RestStatements))) + { + convertIndentationPython(Level); + YP.write(Name); + YP.write(Atom.a(@" = ")); + convertExpressionPython(Expression); + YP.nl(); + foreach (bool l3 in convertStatementListPython(RestStatements, Level, HasBreakableBlock)) + { + yield return true; + yield break; + } + } + } + { + object Level = arg2; + object HasBreakableBlock = arg3; + Variable Name = new Variable(); + Variable Expression = new Variable(); + Variable RestStatements = new Variable(); + foreach (bool l2 in YP.unify(arg1, new ListPair(new Functor2(@"assign", Name, Expression), RestStatements))) + { + convertIndentationPython(Level); + YP.write(Name); + YP.write(Atom.a(@" = ")); + convertExpressionPython(Expression); + YP.nl(); + foreach (bool l3 in convertStatementListPython(RestStatements, Level, HasBreakableBlock)) + { + yield return true; + yield break; + } + } + } + { + object Level = arg2; + object HasBreakableBlock = arg3; + Variable RestStatements = new Variable(); + foreach (bool l2 in YP.unify(arg1, new ListPair(Atom.a(@"yieldtrue"), RestStatements))) + { + convertIndentationPython(Level); + YP.write(Atom.a(@"yield True")); + YP.nl(); + foreach (bool l3 in convertStatementListPython(RestStatements, Level, HasBreakableBlock)) + { + yield return true; + yield break; + } + } + } + { + object Level = arg2; + object HasBreakableBlock = arg3; + Variable RestStatements = new Variable(); + foreach (bool l2 in YP.unify(arg1, new ListPair(Atom.a(@"yieldfalse"), RestStatements))) + { + convertIndentationPython(Level); + YP.write(Atom.a(@"yield False")); + YP.nl(); + foreach (bool l3 in convertStatementListPython(RestStatements, Level, HasBreakableBlock)) + { + yield return true; + yield break; + } + } + } + { + object Level = arg2; + object HasBreakableBlock = arg3; + Variable RestStatements = new Variable(); + foreach (bool l2 in YP.unify(arg1, new ListPair(Atom.a(@"yieldbreak"), RestStatements))) + { + convertIndentationPython(Level); + YP.write(Atom.a(@"return")); + YP.nl(); + foreach (bool l3 in convertStatementListPython(RestStatements, Level, HasBreakableBlock)) + { + yield return true; + yield break; + } + } + } + { + object Level = arg2; + object HasBreakableBlock = arg3; + Variable RestStatements = new Variable(); + foreach (bool l2 in YP.unify(arg1, new ListPair(Atom.a(@"return"), RestStatements))) + { + convertIndentationPython(Level); + YP.write(Atom.a(@"return")); + YP.nl(); + foreach (bool l3 in convertStatementListPython(RestStatements, Level, HasBreakableBlock)) + { + yield return true; + yield break; + } + } + } + { + object Level = arg2; + object HasBreakableBlock = arg3; + Variable RestStatements = new Variable(); + foreach (bool l2 in YP.unify(arg1, new ListPair(Atom.a(@"returntrue"), RestStatements))) + { + convertIndentationPython(Level); + YP.write(Atom.a(@"return True")); + YP.nl(); + foreach (bool l3 in convertStatementListPython(RestStatements, Level, HasBreakableBlock)) + { + yield return true; + yield break; + } + } + } + { + object Level = arg2; + object HasBreakableBlock = arg3; + Variable RestStatements = new Variable(); + foreach (bool l2 in YP.unify(arg1, new ListPair(Atom.a(@"returnfalse"), RestStatements))) + { + convertIndentationPython(Level); + YP.write(Atom.a(@"return False")); + YP.nl(); + foreach (bool l3 in convertStatementListPython(RestStatements, Level, HasBreakableBlock)) + { + yield return true; + yield break; + } + } + } + { + object Level = arg2; + object HasBreakableBlock = arg3; + Variable Name = new Variable(); + Variable RestStatements = new Variable(); + foreach (bool l2 in YP.unify(arg1, new ListPair(new Functor1(@"breakBlock", Name), RestStatements))) + { + convertIndentationPython(Level); + YP.write(Name); + YP.write(Atom.a(@" = True")); + YP.nl(); + convertIndentationPython(Level); + YP.write(Atom.a(@"doBreak = True")); + YP.nl(); + convertIndentationPython(Level); + YP.write(Atom.a(@"break")); + YP.nl(); + foreach (bool l3 in convertStatementListPython(RestStatements, Level, HasBreakableBlock)) + { + yield return true; + yield break; + } + } + } + { + object Level = arg2; + object HasBreakableBlock = arg3; + Variable Name = new Variable(); + Variable ArgList = new Variable(); + Variable RestStatements = new Variable(); + foreach (bool l2 in YP.unify(arg1, new ListPair(new Functor2(@"call", Name, ArgList), RestStatements))) + { + convertIndentationPython(Level); + YP.write(Name); + YP.write(Atom.a(@"(")); + convertArgListPython(ArgList); + YP.write(Atom.a(@")")); + YP.nl(); + foreach (bool l3 in convertStatementListPython(RestStatements, Level, HasBreakableBlock)) + { + yield return true; + yield break; + } + } + } + { + object Level = arg2; + object HasBreakableBlock = arg3; + Variable Obj = new Variable(); + Variable Name = new Variable(); + Variable ArgList = new Variable(); + Variable RestStatements = new Variable(); + foreach (bool l2 in YP.unify(arg1, new ListPair(new Functor3(@"callMember", new Functor1(@"var", Obj), Name, ArgList), RestStatements))) + { + convertIndentationPython(Level); + YP.write(Obj); + YP.write(Atom.a(@".")); + YP.write(Name); + YP.write(Atom.a(@"(")); + convertArgListPython(ArgList); + YP.write(Atom.a(@")")); + YP.nl(); + foreach (bool l3 in convertStatementListPython(RestStatements, Level, HasBreakableBlock)) + { + yield return true; + yield break; + } + } + } + { + object Level = arg2; + object HasBreakableBlock = arg3; + Variable Body = new Variable(); + Variable RestStatements = new Variable(); + Variable NextLevel = new Variable(); + foreach (bool l2 in YP.unify(arg1, new ListPair(new Functor1(@"blockScope", Body), RestStatements))) + { + if (YP.termEqual(HasBreakableBlock, 1)) + { + convertIndentationPython(Level); + YP.write(Atom.a(@"for _ in [1]:")); + YP.nl(); + foreach (bool l4 in YP.unify(NextLevel, YP.add(Level, 1))) + { + foreach (bool l5 in convertStatementListPython(Body, NextLevel, HasBreakableBlock)) + { + if (YP.termEqual(HasBreakableBlock, 1)) + { + if (YP.greaterThan(Level, 1)) + { + convertIndentationPython(Level); + YP.write(Atom.a(@"if doBreak:")); + YP.nl(); + convertIndentationPython(NextLevel); + YP.write(Atom.a(@"break")); + YP.nl(); + foreach (bool l8 in convertStatementListPython(RestStatements, Level, HasBreakableBlock)) + { + yield return true; + yield break; + } + goto cutIf3; + } + foreach (bool l7 in convertStatementListPython(RestStatements, Level, HasBreakableBlock)) + { + yield return true; + yield break; + } + cutIf3: + goto cutIf2; + } + foreach (bool l6 in convertStatementListPython(RestStatements, Level, HasBreakableBlock)) + { + yield return true; + yield break; + } + cutIf2: + { } + } + } + goto cutIf1; + } + foreach (bool l3 in YP.unify(NextLevel, Level)) + { + foreach (bool l4 in convertStatementListPython(Body, NextLevel, HasBreakableBlock)) + { + if (YP.termEqual(HasBreakableBlock, 1)) + { + if (YP.greaterThan(Level, 1)) + { + convertIndentationPython(Level); + YP.write(Atom.a(@"if doBreak:")); + YP.nl(); + convertIndentationPython(NextLevel); + YP.write(Atom.a(@"break")); + YP.nl(); + foreach (bool l7 in convertStatementListPython(RestStatements, Level, HasBreakableBlock)) + { + yield return true; + yield break; + } + goto cutIf5; + } + foreach (bool l6 in convertStatementListPython(RestStatements, Level, HasBreakableBlock)) + { + yield return true; + yield break; + } + cutIf5: + goto cutIf4; + } + foreach (bool l5 in convertStatementListPython(RestStatements, Level, HasBreakableBlock)) + { + yield return true; + yield break; + } + cutIf4: + { } + } + } + cutIf1: + { } + } + } + { + object Level = arg2; + object HasBreakableBlock = arg3; + Variable Expression = new Variable(); + Variable Body = new Variable(); + Variable RestStatements = new Variable(); + Variable NextLevel = new Variable(); + foreach (bool l2 in YP.unify(arg1, new ListPair(new Functor2(@"if", Expression, Body), RestStatements))) + { + convertIndentationPython(Level); + YP.write(Atom.a(@"if ")); + convertExpressionPython(Expression); + YP.write(Atom.a(@":")); + YP.nl(); + foreach (bool l3 in YP.unify(NextLevel, YP.add(Level, 1))) + { + foreach (bool l4 in convertStatementListPython(Body, NextLevel, HasBreakableBlock)) + { + foreach (bool l5 in convertStatementListPython(RestStatements, Level, HasBreakableBlock)) + { + yield return true; + yield break; + } + } + } + } + } + { + object Level = arg2; + object HasBreakableBlock = arg3; + Variable Expression = new Variable(); + Variable Body = new Variable(); + Variable RestStatements = new Variable(); + Variable NextLevel = new Variable(); + foreach (bool l2 in YP.unify(arg1, new ListPair(new Functor2(@"foreach", Expression, Body), RestStatements))) + { + convertIndentationPython(Level); + YP.write(Atom.a(@"for l")); + YP.write(Level); + YP.write(Atom.a(@" in ")); + convertExpressionPython(Expression); + YP.write(Atom.a(@":")); + YP.nl(); + foreach (bool l3 in YP.unify(NextLevel, YP.add(Level, 1))) + { + foreach (bool l4 in convertStatementListPython(Body, NextLevel, HasBreakableBlock)) + { + if (YP.termEqual(HasBreakableBlock, 1)) + { + convertIndentationPython(Level); + YP.write(Atom.a(@"if doBreak:")); + YP.nl(); + convertIndentationPython(NextLevel); + YP.write(Atom.a(@"break")); + YP.nl(); + foreach (bool l6 in convertStatementListPython(RestStatements, Level, HasBreakableBlock)) + { + yield return true; + yield break; + } + goto cutIf6; + } + foreach (bool l5 in convertStatementListPython(RestStatements, Level, HasBreakableBlock)) + { + yield return true; + yield break; + } + cutIf6: + { } + } + } + } + } + { + object Level = arg2; + object HasBreakableBlock = arg3; + Variable Expression = new Variable(); + Variable RestStatements = new Variable(); + foreach (bool l2 in YP.unify(arg1, new ListPair(new Functor1(@"throw", Expression), RestStatements))) + { + convertIndentationPython(Level); + YP.write(Atom.a(@"raise ")); + convertExpressionPython(Expression); + YP.nl(); + foreach (bool l3 in convertStatementListPython(RestStatements, Level, HasBreakableBlock)) + { + yield return true; + yield break; + } + } + } + } + + public static void convertIndentationPython(object Level) + { + { + Variable N = new Variable(); + foreach (bool l2 in YP.unify(N, YP.multiply(Level, 2))) + { + repeatWrite(Atom.a(@" "), N); + return; + } + } + } + + public static void convertArgListPython(object arg1) + { + { + foreach (bool l2 in YP.unify(arg1, Atom.NIL)) + { + return; + } + } + { + Variable Head = new Variable(); + Variable Tail = new Variable(); + foreach (bool l2 in YP.unify(arg1, new ListPair(Head, Tail))) + { + convertExpressionPython(Head); + if (YP.termNotEqual(Tail, Atom.NIL)) + { + YP.write(Atom.a(@", ")); + convertArgListPython(Tail); + return; + goto cutIf1; + } + convertArgListPython(Tail); + return; + cutIf1: + { } + } + } + } + + public static void convertExpressionPython(object arg1) + { + { + Variable X = new Variable(); + foreach (bool l2 in YP.unify(arg1, new Functor1(@"arg", X))) + { + YP.write(X); + return; + } + } + { + Variable Name = new Variable(); + Variable ArgList = new Variable(); + foreach (bool l2 in YP.unify(arg1, new Functor2(@"call", Name, ArgList))) + { + YP.write(Name); + YP.write(Atom.a(@"(")); + convertArgListPython(ArgList); + YP.write(Atom.a(@")")); + return; + } + } + { + Variable Obj = new Variable(); + Variable Name = new Variable(); + Variable ArgList = new Variable(); + foreach (bool l2 in YP.unify(arg1, new Functor3(@"callMember", new Functor1(@"var", Obj), Name, ArgList))) + { + YP.write(Obj); + YP.write(Atom.a(@".")); + YP.write(Name); + YP.write(Atom.a(@"(")); + convertArgListPython(ArgList); + YP.write(Atom.a(@")")); + return; + } + } + { + Variable Name = new Variable(); + Variable ArgList = new Variable(); + foreach (bool l2 in YP.unify(arg1, new Functor2(@"new", Name, ArgList))) + { + YP.write(Name); + YP.write(Atom.a(@"(")); + convertArgListPython(ArgList); + YP.write(Atom.a(@")")); + return; + } + } + { + Variable Name = new Variable(); + foreach (bool l2 in YP.unify(arg1, new Functor1(@"var", Name))) + { + YP.write(Name); + return; + } + } + { + foreach (bool l2 in YP.unify(arg1, Atom.a(@"null"))) + { + YP.write(Atom.a(@"None")); + return; + } + } + { + Variable X = new Variable(); + foreach (bool l2 in YP.unify(arg1, new Functor1(@"not", X))) + { + YP.write(Atom.a(@"not (")); + convertExpressionPython(X); + YP.write(Atom.a(@")")); + return; + } + } + { + Variable X = new Variable(); + Variable Y = new Variable(); + foreach (bool l2 in YP.unify(arg1, new Functor2(@"and", X, Y))) + { + YP.write(Atom.a(@"(")); + convertExpressionPython(X); + YP.write(Atom.a(@") and (")); + convertExpressionPython(Y); + YP.write(Atom.a(@")")); + return; + } + } + { + Variable ArgList = new Variable(); + foreach (bool l2 in YP.unify(arg1, new Functor1(@"objectArray", ArgList))) + { + YP.write(Atom.a(@"[")); + convertArgListPython(ArgList); + YP.write(Atom.a(@"]")); + return; + } + } + { + Variable X = new Variable(); + Variable Codes = new Variable(); + foreach (bool l2 in YP.unify(arg1, new Functor1(@"object", X))) + { + if (YP.atom(X)) + { + YP.write(Atom.a(@"""")); + foreach (bool l4 in YP.atom_codes(X, Codes)) + { + convertStringCodesPython(Codes); + YP.write(Atom.a(@"""")); + return; + } + } + } + } + { + Variable X = new Variable(); + foreach (bool l2 in YP.unify(arg1, new Functor1(@"object", X))) + { + YP.write(X); + return; + } + } + } + + public static void convertStringCodesPython(object arg1) + { + { + foreach (bool l2 in YP.unify(arg1, Atom.NIL)) + { + return; + } + } + { + Variable Code = new Variable(); + Variable RestCodes = new Variable(); + foreach (bool l2 in YP.unify(arg1, new ListPair(Code, RestCodes))) + { + if (YP.termEqual(Code, 34)) + { + YP.put_code(92); + YP.put_code(Code); + convertStringCodesPython(RestCodes); + return; + goto cutIf1; + } + if (YP.termEqual(Code, 92)) + { + YP.put_code(92); + YP.put_code(Code); + convertStringCodesPython(RestCodes); + return; + goto cutIf1; + } + YP.put_code(Code); + convertStringCodesPython(RestCodes); + return; + cutIf1: + { } + } + } + } + + public static IEnumerable member(object X, object arg2) + { + { + Variable x2 = new Variable(); + foreach (bool l2 in YP.unify(arg2, new ListPair(X, x2))) + { + yield return false; + } + } + { + Variable x2 = new Variable(); + Variable Rest = new Variable(); + foreach (bool l2 in YP.unify(arg2, new ListPair(x2, Rest))) + { + foreach (bool l3 in member(X, Rest)) + { + yield return false; + } + } + } + } + + public static IEnumerable append(object arg1, object arg2, object arg3) + { + { + Variable List = new Variable(); + foreach (bool l2 in YP.unify(arg1, Atom.NIL)) + { + foreach (bool l3 in YP.unify(arg2, List)) + { + foreach (bool l4 in YP.unify(arg3, List)) + { + yield return false; + } + } + } + } + { + object List2 = arg2; + Variable X = new Variable(); + Variable List1 = new Variable(); + Variable List12 = new Variable(); + foreach (bool l2 in YP.unify(arg1, new ListPair(X, List1))) + { + foreach (bool l3 in YP.unify(arg3, new ListPair(X, List12))) + { + foreach (bool l4 in append(List1, List2, List12)) + { + yield return false; + } + } + } + } + } + + } +} -- cgit v1.1