Вызов другого предложения в Прологе с тем же именем предложения

Для задания мне необходимо создать систему, основанную на правилах, для проверки соответствия 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).

Проблема, с которой я сталкиваюсь, заключается в том, что если я обнаружу, что дверь, которую я запросил, не соответствует требованиям, мне нужно проверить следующую дверь, если я рекурсивно вызову пункт, я просто получу ту же дверь. Итак, как мне пройти через каждую дверь, проверяя, если это соответствует.


person user1305765    schedule 01.04.2012    source источник


Ответы (1)


Ваш код уже в порядке:

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

Когда вам действительно нужно "перебрать каждую" запись в вашей базе данных, вы скорее оцениваете каждую возможную альтернативу, удовлетворяющую вашему запросу.

В Прологе эта реляционная точка зрения достигается с помощью возврата, что позволяет выполнять исчерпывающий поиск сверху вниз.

На верхнем уровне интерпретатора вы реализуете это, используя ';'

?- 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

Пролог использует списки в качестве основной синтаксической конструкции при выражении алгоритмов: findall/3 — это более простая встроенная функция, которая конструирует списки, полностью оценивая запросы:

?- findall(Door, hasDoor(Room, Door), Doors).
Doors = [wodoorlt1c, wodoorlt1exit, wodoor115lt1].
person CapelliC    schedule 01.04.2012