对于作业,我需要创建一个基于规则的系统来测试对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).
我遇到的问题是,如果发现我要求的门不符合要求,我需要检查隔壁,如果我递归调用该条款,我将获得相同的门,那么我该如何遍历每个门检查是否合规。
答案 0 :(得分: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].