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

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

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

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

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

?- findall(Door, hasDoor(Room, Door), Doors).
Doors = [wodoorlt1c, wodoorlt1exit, wodoor115lt1].
Другие вопросы по тегам