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

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

Строка 5: Строка 5:


<Vip>
<Vip>
interface авто
properties
    цена : unsigned(o).
end interface авто
class выюорАвтомобиля
predicates
    недорогие : () -> авто* Результат.
...
...
     НеДорогие = list::filter({(Авто):-Авто:цена < 10000, !}, СписокАвтомобилей),
implement выюорАвтомобиля
clauses
     неДорогие() = list::filter({(Авто):-Авто:цена <= 10000, !}, списокАвтомобилей).
...
...
</Vip>
</Vip>
Казалось бы ничего нового, ведь то же самое можно записать при помощи дополнительного предиката. Например так
<Vip>predicates
    фильтерДляНедорогих : (авто Авто).
clauses
    фильтерДляНедорогих(Авто):- Авто:цена < 10000, !.
clauses
    неДорогие() = list::filter(фильтерДляНедорогих, списокАвтомобилей).</Vip>
Но сегодня для нас для нас сумма 10000 является пределом мечтаний, а завтра 12000, как быть? Есть два решения, или менять константу, или добавить факт-переменную. Анонимный предикат позволит сделать это изящней.
<Vip>predicates
    неДорогие2 : (unsigned НашиВозможности).
clauses
    неДорогие2(НашиВозможности) = list::filter({(Авто):-Авто:цена <= НашиВозможности, !}, списокАвтомобилей).</Vip>
Если внимательно присмотреться, тут мы наблюдаем картину, ранее недоступную невооруженным глазом. Переменная ''НашиВозможности'' из предиката ''''неДорогие2'''' перекочевала во внутрь другого предиката - фильтра! Вот это уже нельзя сделать использую дополнительный предикат, как раньше.


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


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

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

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