gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 22:30:46 26 4
gpt4 key购买 nike

在学习 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 进行完全替换并以标准方式给出输出:

Left = pencil,Right = butterfly,Above = empty,Below = empty.

有没有一种方法可以强制 Prolog 在输出中进行此类替换,而不会使程序事实和规则困惑? (错误...也许 SWI-Prolog 配置中有一些结果格式化选项。如果没有 - 如何以最少的代码更改实现此目的?)

最佳答案

Prolog 在找到一个最通用的统一器时返回一个解决方案。这是一个非常标准的,我没有找到 any flag改变这种行为(虽然我可能错过了一个,也许是 toplevel_print_options 自定义谓词或其他东西)。

话虽这么说,如果你想要 pretty-print ,你可以推出自己的打印谓词。顺便说一句,它允许您清理数据库,因为在这里您代表原始问题中的额外内容,只能返回 empty,从概念的角度来看,这并不好。我的看法是:

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

测试:

?- position(clock).
left = pencil,
right = butterfly,
above = empty,
below = empty,
true.

关于prolog - 强制序言在输出结果中进行替换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12300992/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com