【问题标题】:Obtain intermediate variables assignments获取中间变量赋值
【发布时间】: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


【解决方案1】:

编写一个元解释器,告诉你什么是真实的,例如,

prove(Goal, True) :-
    phrase(prove(Goal), True).

prove(true) -->
    !.
prove((A,B)) -->
    !,
    prove(A),
    prove(B).
prove((A;B)) -->
    !,
    (   prove(A)
    ;   prove(B)
    ).
prove(Fact) -->
    [Fact],
    { clause(Fact, Body) },
    prove(Body).

现在,给定window(_),我们得到:

?- prove(temperature_trend(decrease), L).
L = [temperature_trend(decrease), window(open)].

可能有很多变化!

【讨论】:

  • 理想情况下,我希望它只告诉我“新”事实(所以只告诉我window(open))。但是,这绝对是朝着正确方向迈出的一步。我将对此进行一些实验。
猜你喜欢
  • 2018-03-03
  • 1970-01-01
  • 2012-04-13
  • 2015-12-07
  • 2011-03-12
  • 1970-01-01
相关资源
最近更新 更多