Ваш код уже в порядке:
?- 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].