buy_car(symbol,symbol) %предикат описывающий машины по марке и цвету
car(symbol,symbol,integer) % предикат описывающий машины в наличии по марке, цвету и цене
colors(symbol,symbol) % предикат описывающий приятный цвет
Clauses
buy_car(Model,Color):-
car (Model, Color, Price),
colors(Color,sexy),
!,
Price < 25000.
car(maserati,green,25000).
car(corvette,black,24000).
car(corvette,red,26000).
car(porsche,red,24000).
colors(red,sexy).
colors(black,mean).
colors(green,preppy).
Goal
buy_car(corvette, Y).
В данном примере поставлена цель: найти corvette (Корвет) приятного цвета, подходящий по стоимости. Отсечение в правиле buy_car означает, что поскольку в базе данных содержится только один "Корвет" приятного цвета, хоть и со слишком высокой ценой, то нет нужды искать другую машину.
Получив целевое утверждение buy_car(corvette, Y) программа отработает следующие шаги:
1. Visual Prolog обращается к car, первой подцели для предиката buy_car.
2. Выполняет проверку для первой машины, Maserati, которая завершается не удачно.
3. Затем проверяет следующее предложение саг и находит соответствие, связывая переменную Color со значением black.
4. Переходит к следующему обращению и проверяет, имеет ли выбранная машина приятный цвет. Черный цвет не является приятным в данной программе, таким образом проверка завершается неудачно.
|
|
5. Выполняет поиск с возвратом к обращению саг и снова ищет Corvette, удовлетворяющий этому критерию.
6. Находит соответствие и снова проверяет цвет. На этот раз цвет оказывается приятным, и Visual Prolog переходит к следующей подцели в правиле: к отсечению. Отсечение немедленно выполняется, "замораживая" все переменные, ранее связанные в этом предложении.
7. Переходит к следующей (и последней) подцели в правиле, к сравнению
Price < 25000.
8. Проверка завершается неудачно, и Visual Prolog пытается совершить поиск с возвратом с целью найти другую машину для проверки. Отсечение предотвращает попытку решить последнюю подцель, и наше целевое утверждение завершается неудачно.
Использование предиката Not
Показать не сексуальные и недорогие машины:
buy_car(_,Color):-
car (_, _, Price),
not(colors(Color,sexy)),
Price < 25000.