强制prolog在输出结果中进行替换

强制prolog在输出结果中进行替换,prolog,output-formatting,Prolog,Output Formatting,在学习Prolog的过程中,我正在制作一个简单的程序,给定一些东西,它能够分辨出东西的左/右/上方/下方。 代码如下: % left_(LeftThing, ToThing) left_(bicycle, camera). left_(pencil, clock). left_(clock, butterfly). left_(butterfly, fish). % above_(AboveThing, ToThing) above_(bicycle, pencil). above_(came

在学习Prolog的过程中,我正在制作一个简单的程序,给定一些东西,它能够分辨出东西的左/右/上方/下方。 代码如下:

% 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), !.
现在当我要求:

?-位置(时钟、左、右、上、下)。

我得到一个答案:

Left = pencil, Right = butterfly, Above = Below, Below = empty. 左=铅笔, 右=蝴蝶, 上面=下面,下面=空。 虽然这是完全正确的答案,但我希望Prolog进行完全替换,并以标准方式给出输出:

左=铅笔, 右=蝴蝶, 上面=空, 低于=空。
有没有一种方法可以迫使Prolog在输出中进行这样的替换,而不会使程序事实和规则变得混乱?(呃……可能在SWI Prolog配置中有一些结果格式化选项。如果没有,如何以最少的代码更改实现这一点?

Prolog在找到一个最通用的unifier时返回一个作为解决方案的unifier。在这里,它是一个完美的标准选项,我没有发现要改变这种行为(我可能错过了一个,可能是
toplevel\u print\u options
自定义谓词或其他东西)

也就是说,如果需要预打印,您可以滚动自己的打印谓词。顺便说一句,它允许您清理数据库,因为在这里,您表示来自原始问题的额外内容,只是为了能够返回
空的
,从概念的角度来看,这是不好的。我的看法是:

% 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).

below(X, Y) :-
    above(Y, X).

print_custom(Y, Pred) :-
    (   call(Pred, X, Y)
     -> true
      ; X = empty),
    format('~w = ~w,~n', [Pred, X]).


position(Thing) :-
    maplist( print_custom(Thing),
             [left, right, above, below] ).
测试:

我找不到这种行为的解决方案,并且在内部(参见boot/toplevel.pl)无条件地调用join_same_bindings/2

有一个未记录的谓词print\u toplevel\u variables/0,但输出没有顺序,并且包含与上次查询无关的“历史”变量:

?- position(clock, Left, Right, Above, Below).
Left = pencil,
Right = butterfly,
Above = Below, Below = empty.

?- print_toplevel_variables.
$Below =    empty
$Above =    empty
$Right =    butterfly
$Left =     pencil
$X =        false
$T =        position(clock,pencil,butterfly,empty,empty)
$Y =        1
false.
?- position(clock).
left = pencil,
right = butterfly,
above = empty,
below = empty,
true.
?- position(clock, Left, Right, Above, Below).
Left = pencil,
Right = butterfly,
Above = Below, Below = empty.

?- print_toplevel_variables.
$Below =    empty
$Above =    empty
$Right =    butterfly
$Left =     pencil
$X =        false
$T =        position(clock,pencil,butterfly,empty,empty)
$Y =        1
false.