Grand Cherokee
Toyota Carina
Mercedes–600
Жигули
Москвич–412
Запорожец
No
CAF– метод (Cut And Fail– отсечение и отказ)
В некоторых случаях при выполнении программы полезно ограничить поиск по базе данных. При использовании этого приема для организации повторений можно, как и раньше использовать возврат по отказу fail, а с помощью отсечения «!» запретить его при выполнении определенных условий.
Внесем в предыдущую программу небольшое изменение:
Car(“BMW–320”).
Car(“Grand Cherokee”).
Car(“Toyota Carina”).
Car(“Mercedes–600”)
car(“Жигули”):– !.
Car(“Москвич–412”).
Car(“Запорожец”)
look_cars:–
Car(X), write(X), nl,
Fail.
look_cars:–
write(“Москвич и Запорожец– это CARа за грехи наши !”).
До определенного момента программа работает так же, как и в предыдущей версии, но потом она поступает подобно уважающему себя автомобилисту: после Жигулей у нее срабатывает отсечение альтернатив:
?– look_cars
BMW–320
Grand Cherokee
Toyota Carina
Mercedes–600
Жигули
Москвич и Запорожец– это CARа за грехи наши !
Yes
UDR– метод (User-Defined Repeat– повторения, управляемые пользователем)
В отличие от предыдущих методов, в которых количество повторений ограничено общим количеством не опробованных альтернатив, здесь повторения могут выполняться произвольное число раз. Для этой цели очень часто используется следующее рекурсивное определение: