0

对于作业,我需要创建一个基于规则的系统来测试是否符合 fire_code

roomHasFastExit 是我的测试条款,其他条款是建筑计划的一部分

在这种情况下,Rm 等于 wotl1

roomHasFastExit(Rm):- hasDoor(Rm, Door), isa(Door, outsideDoor).

hasDoor(wolt1, wodoorlt1c).
hasDoor(wolt1, wodoorlt1exit).
hasDoor(wolt1, wodoor115lt1).

isa(wodoor115lt1, door).
isa(wodoorlt1c, door).
isa(wodoorlt1exit, outsideDoor).

我发生的问题是如果发现我请求的门不符合要求,我需要检查下一个门,如果我递归调用该子句,我只会得到相同的门,那么我如何循环遍历每个门检查是否它是合规的。

4

1 回答 1

0

您的代码已经可以了:

?- roomHasFastExit(Rm).
Rm = wolt1 ;
false.

当您确实需要“遍历数据库的每条”记录时,您是在评估满足您查询的每个可能的替代方案。

在 Prolog 中,这种关系观点是通过回溯获得的,它允许以自上而下的顺序进行详尽的搜索。

在解释器顶层,您可以使用 ';' 来实现它

?- hasDoor(wolt1,X).
X = wodoorlt1c ;
X = wodoorlt1exit ;
X = wodoor115lt1.

强制进行全面评估的有用库谓词是forall /2。例如

show_available_doors(Room) :-
    forall(hasDoor(Room, Door), writeln(Door)).

输出:

?- show_available_doors(wolt1).
wodoorlt1c
wodoorlt1exit
wodoor115lt1

Prolog 在表达算法时使用列表作为主要语法结构:findall /3 它是构造列表的更简单的内置函数,完全评估查询:

?- findall(Door, hasDoor(Room, Door), Doors).
Doors = [wodoorlt1c, wodoorlt1exit, wodoor115lt1].
于 2012-04-01T04:45:32.247 回答