After removing the
default value, falf provides
a shorter solution: only 5 steps are needed now! Looking at the
solution, it seems that, surprisingly, an empty boat can move now from
one bank to the other.
The
explanation for this result is that, when
no action is executed, rules (R1) and (R2) do not provide a
value for moved(mis) and moved(can), and so, they are
left unknown (note they do not have a default value now). As a result,
constraints (R3) and (R5) are not
applicable and cannot force the execution of some action. Finally, as we have
made rule (R7) independent
of the action execution, the boat misterously moves "alone" to the
opposite bank. This problem can be simply solved by adding a condition
to (R7) as follows:
boatbank'=opposite(boatbank) :- move(M,C).
% (R7b)
which is more
natural, as it reflects that the change in the boat bank only occurs
after some movement. However, the execution becomes drastically slower,
since (R7b) involves
a significant increase in the number of ground rules that must be
handled by the ASP solver.