在Prolog中使用相同的子句名称调用另一个子句

时间:2012-04-01 02:27:43

标签: prolog clause

对于作业,我需要创建一个基于规则的系统来测试对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).

我遇到的问题是,如果发现我要求的门不符合要求,我需要检查隔壁,如果我递归调用该条款,我将获得相同的门,那么我该如何遍历每个门检查是否合规。

1 个答案:

答案 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].