【发布时间】:2017-11-27 11:07:23
【问题描述】:
我正在尝试使用 Prolog 来表示房间的状态。
我有一套规则和一套事实,但有时有些事实是 没有定义的。例如,房间内的温度会因以下任一原因而降低 冷却或打开窗户,但有时我没有窗户传感器。
% Rules
temperature_trend(decrease) :-
cooling(on).
temperature_trend(decrease) :-
window(open).
% Facts
cooling(off).
%window(close). % Unknown, I do not have a window sensor
% Main
main() :-
temperature_trend(decrease).
如果我运行这个程序,我会得到一个undefined procedure 错误。我可以应付
通过显式设置窗口
使用window(W). 将状态设置为“任何东西”(我以编程方式准备 Prolog
来源,所以这很容易)。
现在查询temperature_trend(decrease)
会成功,因为window(W) 会导致window(open)。然而,在这
案例我想知道W = open。
有没有办法为这个事实返回变量赋值?还是我以错误的方式解决问题?
请注意,
规则树可以任意深,例如我可以添加一个新规则next_temperature(lower) :- temperature_trend(decrease).,我仍然
想知道next_temperature(lower)只有通过设置W = open才能成功。术语也更复杂
因为它们也有时间索引 (T = 232)。
也许一种选择是返回一个分配列表,该列表将为空 如果所有事实都知道的话。
【问题讨论】:
-
将
window/1声明为动态的,这样如果事实不存在,window(X)查询就会失败。:- dynamic(window/1). -
理想情况下,如果事实不存在,我不希望它失败。我希望它告诉我添加这样的事实会成功。
-
好吧,根据定义,添加这样一个事实当然会成功。所以我不确定你的意思是什么。如果不声明它是动态的,如果通过事实或谓词与查询不匹配,您会得到一个解释器错误,它不存在。如果您声明它是动态的,并进行查询,但它不存在,查询就会失败,就好像事实/谓词在那里一样,但不匹配。也许您需要在问题中显示一个更清晰的示例。
-
如果我将
window(W).添加为事实,解释器将“分配”W = open并且查询将成功。我想知道发生了这样的“分配”,即通过将window(open).添加到我的事实中,查询会成功。
标签: prolog