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

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

м
Строка 10: Строка 10:
end interface авто
end interface авто


class выюорАвтомобиля
class выборАвтомобиля
predicates
predicates
     недорогие : () -> авто* Результат.
     недорогие : () -> авто* Результат.
...
...
implement выюорАвтомобиля
implement выборАвтомобиля
clauses
clauses
     неДорогие() = list::filter({(Авто):-Авто:цена <= 10000, !}, списокАвтомобилей).
     неДорогие() = list::filter({(Авто):-Авто:цена <= 10000, !}, списокАвтомобилей).
Строка 35: Строка 35:
     неДорогие2(НашиВозможности) = list::filter({(Авто):-Авто:цена <= НашиВозможности, !}, списокАвтомобилей).</Vip>
     неДорогие2(НашиВозможности) = list::filter({(Авто):-Авто:цена <= НашиВозможности, !}, списокАвтомобилей).</Vip>


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


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


[[Категория:VipLanguage]]
[[Категория:VipLanguage]]

Версия 11:43, 6 ноября 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' перекочевала во внутрь другого предиката - фильтра! Вот это уже нельзя сделать использую дополнительный предикат, как раньше.

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