Я пытаюсь попрактиковаться в программировании набора ответов, но у меня возникают проблемы с обеспечением согласованности моих инерционных потоков на разных временных шагах. Я использую систему SPARC для запуска программы.
Я пытаюсь составить виртуальный план «робота» о том, как перемещать объекты между людьми. Все актеры (люди и робот) могут иметь только один объект за раз. Робот и один человек начинают без объекта, остальные начинают с объекта.
Я посмотрел примеры из книги «Знания, представление, рассуждения и разработка интеллектуальных агентов», а также предыдущие тестовые программы, которые я запускал (которые работали), но я полагаю, что я предполагаю некоторые основныеошибка, которую я не могу понять здесь.
#const n = 3.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
sorts
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
#robot = [r].
#person = [p][0..6].
#actor = #robot + #person.
#object = [o][0..5].
#hold_I_fluent = has(#actor(X),#object(Y)).
#inertial_fluent = #hold_I_fluent.
#fluent = #inertial_fluent.
#take_action = take(#robot(Z), #person(X), #object(Y)).
#give_action = give(#robot(Z), #person(X), #object(Y)).
#action = #take_action + #give_action.
#step = 0..n.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
predicates
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
holds(#fluent,#step).
occurs(#action,#step).
success().
goal(#step).
something_happened(#step).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
rules
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%Defines rules for actions:
%%if robot takes object from person at time I, robot has it at time I+1
%%if robot gives object at time I to person, person has it at time I+1
holds(has(R,O),I+1) :- #object(O1),
occurs(take(R,P,O),I),
holds(has(P,O),I),
-holds(has(R,O1),I),
P != R,
O != O1.
-holds(has(P,O),I+1) :- #object(O1),
occurs(take(R,P,O),I),
holds(has(P,O),I),
-holds(has(R,O1),I),
P != R,
O != O1.
holds(has(P,O),I+1) :- #object(O1),
occurs(give(R,P,O),I),
holds(has(R,O),I),
-holds(has(P,O1),I),
P != R,
O != O1.
-holds(has(R,O),I+1) :- #object(O1),
occurs(give(R,P,O),I),
holds(has(R,O),I),
-holds(has(P,O1),I),
P != R,
O != O1.
%%two actors can't have the same object
-holds(has(A,O),I) :- #actor(B),
holds(has(B,O),I),
A != B.
%%An actor can't have two objects
-holds(has(A,O1),I) :- #object(O2),
holds(has(A,O2),I),
O1 != O2.
%%Only one action occurs at a time.
:- occurs(A1,I),
occurs(A2,I),
A1 != A2.
%%Goal must be achieved
:- not success.
%%Success occurs if goal true at time I
success :- goal(I).
%%If goal not achieved, an action may happen
occurs(A,I) | -occurs(A,I) :- not goal(I).
%%if an action occured, something_happened
something_happened(I) :- occurs(A,I).
%%Something must happen at each time step, if goal isnt achieved
:- goal(I), goal(I-1),
J < I,
not something_happened(J).
%% General Inertia Axiom
holds(F,I+1) :- #inertial_fluent(F),
holds(F,I),
not -holds(F,I+1).
-holds(F,I+1) :- #inertial_fluent(F),
-holds(F,I),
not holds(F,I+1).
%% CWA for Actions
-occurs(A,I) :- not occurs(A,I).
%%%%%%%%%%%%%%%%%%
%%Initial setup
%%%%%%%%%%%%%%%%%%
holds(has(p0, o0),0).
holds(has(p1, o1),0).
holds(has(p2, o2),0).
holds(has(p3, o3),0).
holds(has(p4, o4),0).
holds(has(p5, o5),0).
%%%%%%%%%%%%%%%%%%
%%Goal
%%%%%%%%%%%%%%%%%%
goal(I) :- holds(has(p3,o1),I).
%%%%%%%%%%%%%%%%%%
display
%%%%%%%%%%%%%%%%%%
occurs.
{происходит (take (r, p1, o1), 0), происходит (дает (r, p5, o0), 1), происходит (give (r, p3, o1), 2)}
При выполнении кода, когда я пытаюсь получить объект o1, удерживаемый p1, вместо p3, всегда есть дополнительный ошибочный шаг (происходит (укажите (r, p5, o0), 1)) в качестве первого или второго шага.