В процессе изучения Пролога я делаю простую программу, которая при определенных условиях может определять, что находится слева / справа / сверху / снизу от этой вещи. Код такой:
% left_(LeftThing, ToThing)
left_(bicycle, camera).
left_(pencil, clock).
left_(clock, butterfly).
left_(butterfly, fish).
% above_(AboveThing, ToThing)
above_(bicycle, pencil).
above_(camera, butterfly).
right(X, Y) :-
left_(Y, X);
X = (empty).
below(X, Y) :-
above_(Y, X);
X = (empty).
left(X, Y) :-
left_(X, Y);
X = (empty).
above(X, Y) :-
above_(X, Y);
X = (empty).
position(Thing, Left, Right, Above, Below) :-
left(Left, Thing),
right(Right, Thing),
above(Above, Thing),
below(Below, Thing), !.
Теперь, когда я прошу:
?- position(clock, Left, Right, Above, Below).
Я получаю ответ:
Left = pencil, Right = butterfly, Above = Below, Below = empty.
Хотя это совершенно правильный ответ, я бы хотел, чтобы Prolog произвел полные замены и выдал результат стандартным способом:
Left = pencil, Right = butterfly, Above = empty, Below = empty.
Есть ли способ заставить Prolog выполнять такие замены в выводе, не загромождая программными фактами и правилами? (эээ ... может быть, в конфигурации SWI-Prolog есть опция форматирования результатов. Если нет - как этого добиться с минимальными изменениями кода?)