Анонимные предикаты: различия между версиями

Материал из wikiru.visual-prolog.com

м
м
Строка 23: Строка 23:
Казалось бы ничего нового, ведь то же самое можно записать при помощи дополнительного предиката. Например так
Казалось бы ничего нового, ведь то же самое можно записать при помощи дополнительного предиката. Например так
<Vip>predicates
<Vip>predicates
     фильтерДляНедорогих : (авто Авто).
     фильтрДляНедорогих : (авто Авто).
clauses
clauses
     фильтерДляНедорогих(Авто):- Авто:цена < 10000, !.
     фильтрДляНедорогих(Авто):- Авто:цена < 10000, !.
clauses
clauses
     неДорогие() = list::filter(фильтерДляНедорогих, списокАвтомобилей).</Vip>
     неДорогие() = list::filter(фильтрДляНедорогих, списокАвтомобилей).</Vip>


Но сегодня для нас сумма 10000 является пределом мечтаний, а завтра 12000, как быть? Есть два решения, или менять константу, или добавить факт-переменную. Анонимный предикат позволит сделать это изящней.
Но сегодня для нас сумма 10000 является пределом мечтаний, а завтра 12000, как быть? Есть два решения, или менять константу, или добавить факт-переменную. Анонимный предикат позволит сделать это изящней.

Версия 20:43, 7 ноября 2007

Анонимные предикаты - новая возможность компилятора, которая будет реализована начиная с версии 7.2


Пример использования:

interface авто
properties
    цена : unsigned(o).
end interface авто
 
class выборАвтомобиля
predicates
    недорогие : () -> авто* Результат.
...
implement выборАвтомобиля
clauses
    неДорогие() = list::filter({(Авто):-Авто:цена <= 10000, !}, списокАвтомобилей).
...


Казалось бы ничего нового, ведь то же самое можно записать при помощи дополнительного предиката. Например так

predicates
    фильтрДляНедорогих : (авто Авто).
clauses
    фильтрДляНедорогих(Авто):- Авто:цена < 10000, !.
clauses
    неДорогие() = list::filter(фильтрДляНедорогих, списокАвтомобилей).

Но сегодня для нас сумма 10000 является пределом мечтаний, а завтра 12000, как быть? Есть два решения, или менять константу, или добавить факт-переменную. Анонимный предикат позволит сделать это изящней.

predicates
    неДорогие2 : (unsigned НашиВозможности).
clauses
    неДорогие2(НашиВозможности) = list::filter({(Авто):-Авто:цена <= НашиВозможности, !}, списокАвтомобилей).

Если внимательно присмотреться, то тут мы наблюдаем картину, ранее недоступную невооружённым глазом. Переменная НашиВозможности из предиката 'неДорогие2' перекочевала во внутрь другого предиката - фильтра! Вот это уже нельзя сделать использую дополнительный предикат, как раньше.

Это не оконченная статья