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