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

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

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


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


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


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

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

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