Вызов другого предложения в Прологе с тем же именем - PullRequest
0 голосов
/ 01 апреля 2012

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

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

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