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

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

м
 
(не показано 5 промежуточных версий 1 участника)
Строка 1: Строка 1:
Анонимные предикаты - новая возможность компилятора, которая будет реализована начиная с версии 7.2
Анонимные предикаты - новая возможность компилятора, которая реализована начиная с версии 7.2
   
   
 
===Вступление===
Пример использования:
Пример использования:


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


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


Это не оконченная статья
===Погружение===
Давайте еще усложним наш пример, не сильно отрываясь от реальности. Представим, что у нас есть следующий интерфейс:
<Vip>interface покупатель
properties
    зарплата : unsigned(o).
    фильтрМашин : () -> list::filter.
end interface покупатель</Vip>
Попробуем написать реализацию
<Vip>implement покупатель
facts
    зарплата : unsigned.
clauses
    фильтрМашин() =
 
{(Авто) :- Авто:цена <= НашиВозможности, !}, списокАвтомобилей)
implement покупатель</Vip>
 
===Детали реализации===
===Где использовать===
 
Это неоконченная статья


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

Текущая версия на 12:25, 26 мая 2009

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

Погружение

Давайте еще усложним наш пример, не сильно отрываясь от реальности. Представим, что у нас есть следующий интерфейс:

interface покупатель
properties
    зарплата : unsigned(o).
    фильтрМашин : () -> list::filter.
end interface покупатель

Попробуем написать реализацию

implement покупатель
facts
    зарплата : unsigned.
clauses
    фильтрМашин() = 
 
{(Авто) :- Авто:цена <= НашиВозможности, !}, списокАвтомобилей)
implement покупатель

Детали реализации

Где использовать

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