【发布时间】:2021-03-04 00:05:19
【问题描述】:
以这个程序为例。它使用延迟目标
room(green).
room(blue).
room(red).
room(white).
location(jimmy,red).
location(ricky,blue).
location(cindy,green).
% "Is a certain room unoccupied?"
not_occupied(Room) :-
nonvar(Room),
assertion(room(Room)),
\+ location(_Person,Room).
% If no specific "Room" has been given, the negated goal is
% delayed until the "Room" has been instantiated.
not_occupied(Room) :-
var(Room),
!,
when(
ground(Room),
(\+ location(_Person,Room))
).
如果我现在问
?- not_occupied(R).
那么Prolog成功,输出一个残差目标
?- not_occupied(R).
when(ground(R),\+location(_7676,R)).
实际上,它真的不会成功。它乐观地成功(因为为了不停止计算,它必须成功)但实际的逻辑成功取决于残差目标的实际成功。
如何以编程方式确定子目标是否成功实现了剩余目标? (那我该怎么办?)方法是什么?
附言
拥有第二个 Prolog 真值可能是一个不错的 Prolog 扩展,因为true+ 将指示“在剩余目标成功的条件下成功”。这实际上似乎是有必要的:
在 SWI-Prolog 中,采用这个固有的模棱两可的目标:
do :- not_occupied(_).
调用它甚至根本不会打印出任何剩余目标:
?- do.
true.
目标成功了吗?不是真的,它仍然处于逻辑边缘,但顶层甚至没有告诉我。另一方面,没有办法向程序提供更多信息来解决剩余目标。但是因为计算运行到终点而默认为“成功”感觉不对。
【问题讨论】: