// Domaine + problème Gripper, résolus avec le MÊME planificateur (0 changement)
var gripper = new Domain { Name = "gripper-strips" };
gripper.Types["room"] = new TypeDef { Name = "room", Parent = null };
gripper.Types["ball"] = new TypeDef { Name = "ball", Parent = null };
gripper.Types["gripper"] = new TypeDef { Name = "gripper", Parent = null };
// move(?from,?to - room)
gripper.Actions.Add(new ActionSchema {
Name = "move", Params = { ("from","room"), ("to","room") },
Pre = { ("room", new[]{"from"}), ("room", new[]{"to"}), ("at-robby", new[]{"from"}) },
Add = { ("at-robby", new[]{"to"}) },
Del = { ("at-robby", new[]{"from"}) }
});
// pick(?obj - ball, ?room - room, ?gripper - gripper)
gripper.Actions.Add(new ActionSchema {
Name = "pick", Params = { ("obj","ball"), ("room","room"), ("gripper","gripper") },
Pre = { ("ball", new[]{"obj"}), ("room", new[]{"room"}), ("gripper", new[]{"gripper"}),
("at", new[]{"obj","room"}), ("at-robby", new[]{"room"}), ("free", new[]{"gripper"}) },
Add = { ("carry", new[]{"obj","gripper"}) },
Del = { ("at", new[]{"obj","room"}), ("free", new[]{"gripper"}) }
});
// drop(?obj - ball, ?room - room, ?gripper - gripper)
gripper.Actions.Add(new ActionSchema {
Name = "drop", Params = { ("obj","ball"), ("room","room"), ("gripper","gripper") },
Pre = { ("ball", new[]{"obj"}), ("room", new[]{"room"}), ("gripper", new[]{"gripper"}),
("at-robby", new[]{"room"}), ("carry", new[]{"obj","gripper"}) },
Add = { ("at", new[]{"obj","room"}), ("free", new[]{"gripper"}) },
Del = { ("carry", new[]{"obj","gripper"}) }
});
var pGrip = new Problem { Name = "gripper-2balls", Dom = gripper };
pGrip.Objects.AddRange(new[] {
("rooma","room"), ("roomb","room"),
("ball1","ball"), ("ball2","ball"),
("left","gripper"), ("right","gripper")
});
pGrip.Init.UnionWith(new[] {
Atom("room","rooma"), Atom("room","roomb"),
Atom("ball","ball1"), Atom("ball","ball2"),
Atom("gripper","left"), Atom("gripper","right"),
Atom("at-robby","rooma"),
Atom("free","left"), Atom("free","right"),
Atom("at","ball1","rooma"), Atom("at","ball2","rooma")
});
pGrip.Goal.AddRange(new[] {
("at", new[]{"ball1","roomb"}),
("at", new[]{"ball2","roomb"})
});
var gGrip = Planner.Ground(gripper, pGrip);
var planG = Planner.Solve(pGrip, gGrip);
var sb = new System.Text.StringBuilder();
sb.AppendLine($"Gripper grounding : {gGrip.Count} actions groundées");
sb.AppendLine($"Plan trouvé : {planG?.Count ?? 0} actions");
sb.AppendLine();
if (planG != null) foreach (var step in planG)
sb.AppendLine($" - {step}");
sb.AppendLine();
sb.AppendLine("Lecture : le robot saisit les 2 balles (1 par pince), ");
sb.AppendLine("déplace, puis pose les 2 — exploite les 2 pinces en parallèle.");
display(sb.ToString());