强制prolog在输出结果中进行替换
在学习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
% 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.