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

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

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


Строка 37: Строка 37:
Если внимательно присмотреться, то тут мы наблюдаем картину, ранее недоступную невооружённым глазом. Переменная ''НашиВозможности'' из предиката ''''неДорогие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 покупатель

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

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

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