Re[4]: Логическое программирование в Nemerle?
От: mkizub Литва http://symade.tigris.org
Дата: 10.06.07 13:49
Оценка:
Здравствуйте, Курилка, Вы писали:

АХ>>>Основная проблема же "думатель" хороший написать.


M>>Могу выдать исходники генератора state machine, которые этим занимаются. Там не очень сложно.


К>Стоп, какие стейт-машины, тыж говоришь логические условия через имеративные не выражаются?


Ик. Соврал значит. Да и дело ли верить таким утверждениям — будь они такие невыражаемые, как бы
тогда Prolog работал?
SOP & SymADE: http://symade.tigris.org , блог http://mkizub.livejournal.com
Re[6]: Логическое программирование в Nemerle?
От: mkizub Литва http://symade.tigris.org
Дата: 10.06.07 13:56
Оценка:
Здравствуйте, _pk_sly, Вы писали:

M>> Логическая парадигма — потому и отдельная, что через

M>>императивную не выражается.

__>Ну так и надо приводить такие примеры, которые не выражаются.

__>Не надо за нас беспокоиться что мы не поймём. Умные люди тут тоже присутствуют.
__>А то смешно как-то получается.

__>Насчёт ленивых вычислений — в Nemerle они присутствуют и эта возможность никак не связана с императивностью или "логичностью"


__>Таки ждём удачного примера, для чего это надо.



class Field {
 String name;
 boolean is_private;
}
class Struct {
 Field[] fields;
 
 rule find(String name, Field@ f)
 {
  f @= fields,
  f.name.startsWith(name)
 }

 rule find_public(String name, Field@ f)
 {
  find_all(name, f),
  f.is_public
 }
}
SOP & SymADE: http://symade.tigris.org , блог http://mkizub.livejournal.com
Re[8]: Логическое программирование в Nemerle?
От: WolfHound  
Дата: 10.06.07 14:00
Оценка:
Здравствуйте, mkizub, Вы писали:

M>В общем случае, наверное, ленивых вычислений недостаточно. Они ведь, насколько я понимаю, откладывают вычисление до определённого момента, когда это понадобится.

Ну может в совсем общем backtrack-инг и мощьнее но тебе пока не удается показать практический пример.

M>А logic требует backtrac-инга, то есть сохранения состояния функции, и продолжение вычисления начиная с этого места (поиск следующего решения).

M>Вот пример, где без backtrack-инга не обойтись

Да ну?!
module Util
{
    public IsEmpty[T](this e : IEnumerable[T]) : bool
    {
        !IsNotEmpty(e);
    }
    public IsNotEmpty[T](this e : IEnumerable[T]) : bool
    {
        e.GetEnumerator().MoveNext();
    }
}

def arr_foo = ["a", "b", "c"];
def foo(s)
{
  arr_foo.FilterLazy(ss => ss == s);
}

def arr_bar = ["b", "c", "d"];
def bar(s)
{
  foo(s).FilterLazy(ss => arr_bar.Contains(ss));
}

WriteLine(bar("a").IsNotEmpty());
WriteLine(bar("b").IsNotEmpty());
WriteLine(bar("c").IsNotEmpty());
WriteLine(bar("d").IsNotEmpty());


Напечатает
False
True
True
False


M>Если на практике, то это может быть foo — поиск поля в классе, а bar — проверка того, что это поле не приватное для того класса. А если мы ищем поле в своём классе — то вызваем непосредственно foo, потому как мы имеем доступ к приватным полям.

Все это делается както так
match (someClass.Fileds.Find(field => field.Name == name && field.IsPublic))
{
| Some(field) => // Нашли
| Nome => => // Не нашли
}


А вот кстати конструкция которая рулит при разработке компиляторов. pattern matching называется. Расказывать что это такое?
Причем в отличии от весьма сомнительного backtrack-инга производительность которого оставляет жилать лучшего (ибо чудес не бывает) pattern matching преобразуется в оптимальное дерево принятия решения.
... << RSDN@Home 1.2.0 alpha rev. 673>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[9]: Логическое программирование в Nemerle?
От: mkizub Литва http://symade.tigris.org
Дата: 10.06.07 14:11
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>Здравствуйте, mkizub, Вы писали:


M>>В общем случае, наверное, ленивых вычислений недостаточно. Они ведь, насколько я понимаю, откладывают вычисление до определённого момента, когда это понадобится.

WH>Ну может в совсем общем backtrack-инг и мощьнее но тебе пока не удается показать практический пример.

M>>А logic требует backtrac-инга, то есть сохранения состояния функции, и продолжение вычисления начиная с этого места (поиск следующего решения).

M>>Вот пример, где без backtrack-инга не обойтись

WH>Да ну?!

WH>
WH>module Util
WH>{
WH>    public IsEmpty[T](this e : IEnumerable[T]) : bool
WH>    {
WH>        !IsNotEmpty(e);
WH>    }
WH>    public IsNotEmpty[T](this e : IEnumerable[T]) : bool
WH>    {
WH>        e.GetEnumerator().MoveNext();
WH>    }
WH>}

WH>def arr_foo = ["a", "b", "c"];
WH>def foo(s)
WH>{
WH>  arr_foo.FilterLazy(ss => ss == s);
WH>}

WH>def arr_bar = ["b", "c", "d"];
WH>def bar(s)
WH>{
WH>  foo(s).FilterLazy(ss => arr_bar.Contains(ss));
WH>}

WH>WriteLine(bar("a").IsNotEmpty());
WH>WriteLine(bar("b").IsNotEmpty());
WH>WriteLine(bar("c").IsNotEmpty());
WH>WriteLine(bar("d").IsNotEmpty());
WH>


WH>Напечатает

WH>
WH>False
WH>True
WH>True
WH>False
WH>


M>>Если на практике, то это может быть foo — поиск поля в классе, а bar — проверка того, что это поле не приватное для того класса. А если мы ищем поле в своём классе — то вызваем непосредственно foo, потому как мы имеем доступ к приватным полям.

WH>Все это делается както так
WH>
WH>match (someClass.Fileds.Find(field => field.Name == name && field.IsPublic))
WH>{
WH>| Some(field) => // Нашли
WH>| Nome => => // Не нашли
WH>}
WH>


WH>А вот кстати конструкция которая рулит при разработке компиляторов. pattern matching называется. Расказывать что это такое?

WH>Причем в отличии от весьма сомнительного backtrack-инга производительность которого оставляет жилать лучшего (ибо чудес не бывает) pattern matching преобразуется в оптимальное дерево принятия решения.

Lazy код делает вычисление один раз. А backtrack-инг позволяет прервать вычисления, а потом продолжить их дальше, если необходимо. Они не взаимозаменяемы.

Замечательно, ты проверил, что "a" и прочие строки подходят. А теперь найди все строки, которые подходят.
pattern matching никакого улучшения по отношению к backtrack-ингу не имеет, потому что это просто разные вещи.
Логическое программирование — это задание правил, и потом использование этих правил для поиска решения или проверки правильнсти имеющейся гипотезы.
На основе одних и тех-же правил.
А сравнешие с образцом — это совсем из другой оперы. Они настолько разные, что их сравнивать — как лампочки с апельсинами.
SOP & SymADE: http://symade.tigris.org , блог http://mkizub.livejournal.com
Re[8]: Логическое программирование в Nemerle?
От: IO Украина  
Дата: 10.06.07 14:16
Оценка:
Здравствуйте, mkizub, Вы писали:

M>В общем случае, наверное, ленивых вычислений недостаточно. Они ведь, насколько я понимаю, откладывают вычисление до определённого момента, когда это понадобится.

M>А logic требует backtrac-инга, то есть сохранения состояния функции, и продолжение вычисления начиная с этого места (поиск следующего решения).
Или я недопонимаю, или вот:
using System.Console;
using Nemerle.Utility;

[Record]
class Str
{
    s : string;

    public GetS(context: string) : string
    {
        WriteLine($"Getting \"$s\" in $context");
        s;
    };
}

def arr = [
    Str("a"),
    Str("bb"),
    Str("c"), 
    Str("dd"), 
    Str("a")
];

def find_foo(i)
{
    arr.FilterLazy(s => s.GetS("find_foo()").Length <= i);
};

def find_bar()
{
    find_foo(1).FilterLazy(s => s.GetS("find_bar()") == "a");
};

foreach (s in find_bar())
    WriteLine(s.GetS("foreach cycle"));

Getting "a" in find_foo()
Getting "a" in find_bar()
Getting "a" in foreach cycle
a
Getting "bb" in find_foo()
Getting "c" in find_foo()
Getting "c" in find_bar()
Getting "dd" in find_foo()
Getting "a" in find_foo()
Getting "a" in find_bar()
Getting "a" in foreach cycle
a
Re[10]: Логическое программирование в Nemerle?
От: WolfHound  
Дата: 10.06.07 14:35
Оценка:
Здравствуйте, mkizub, Вы писали:

M>Lazy код делает вычисление один раз. А backtrack-инг позволяет прервать вычисления, а потом продолжить их дальше, если необходимо. Они не взаимозаменяемы.

А Lazy так и работает.
Вот этот код превращается в класс содержащий конечный автомат.
    public FilterLazy [T] (this source : SCG.IEnumerable [T], predicate : T -> bool) : SCG.IEnumerable [T]
    {
      foreach(elem when predicate(elem) in source)
        yield elem;
    }

Когда дело доходит до yield вычисление прерывается и возвращается очередное значение.
Когда енумератор попросят следующие значение работа возобновится сразу после yield.

M>Замечательно, ты проверил, что "a" и прочие строки подходят. А теперь найди все строки, которые подходят.

А я что делаю?
Может будешь читать что написано, а не фантазировать.
True/False говорит отдельная функция IsNotEmpty которая проверяет ечть в енумераторе что-то или нет.

M>pattern matching никакого улучшения по отношению к backtrack-ингу не имеет, потому что это просто разные вещи.

А где я это сказал?
Я сказал что pattern matching рулит при разработке компиляторов.
Причем реально рулит и чемто другим его заменить очень не просто.
А вот твои логические изыски легко заменяются парой функций высшего порядка.

ЗЫ Следи за объемом цитирования. А то у меня уже появляется жилание добраться до банилки.
... << RSDN@Home 1.2.0 alpha rev. 673>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[9]: Логическое программирование в Nemerle?
От: mkizub Литва http://symade.tigris.org
Дата: 10.06.07 14:45
Оценка:
Здравствуйте, IO, Вы писали:

IO>Здравствуйте, mkizub, Вы писали:


M>>В общем случае, наверное, ленивых вычислений недостаточно. Они ведь, насколько я понимаю, откладывают вычисление до определённого момента, когда это понадобится.

M>>А logic требует backtrac-инга, то есть сохранения состояния функции, и продолжение вычисления начиная с этого места (поиск следующего решения).
IO>Или я недопонимаю, или вот:
IO>
IO>using System.Console;
IO>using Nemerle.Utility;

IO>[Record]
IO>class Str
IO>{
IO>    s : string;

IO>    public GetS(context: string) : string
IO>    {
IO>        WriteLine($"Getting \"$s\" in $context");
IO>        s;
IO>    };
IO>}

IO>def arr = [
IO>    Str("a"),
IO>    Str("bb"),
IO>    Str("c"), 
IO>    Str("dd"), 
IO>    Str("a")
IO>];

IO>def find_foo(i)
IO>{
IO>    arr.FilterLazy(s => s.GetS("find_foo()").Length <= i);
IO>};

IO>def find_bar()
IO>{
IO>    find_foo(1).FilterLazy(s => s.GetS("find_bar()") == "a");
IO>};

IO>foreach (s in find_bar())
IO>    WriteLine(s.GetS("foreach cycle"));
IO>

IO>
IO>Getting "a" in find_foo()
IO>Getting "a" in find_bar()
IO>Getting "a" in foreach cycle
IO>a
IO>Getting "bb" in find_foo()
IO>Getting "c" in find_foo()
IO>Getting "c" in find_bar()
IO>Getting "dd" in find_foo()
IO>Getting "a" in find_foo()
IO>Getting "a" in find_bar()
IO>Getting "a" in foreach cycle
IO>a
IO>


Да, так будет работать. Есть два основных способа реализации логических программ —
1. state machine, которая сохраняет состояние метода после выхода из него, и продолжает с того-же места после повторного входа в него.
2. Оборачивание каждого условия в ленивую функцию и возврат получившегося ленивого выражения.
Вы можете написать аналогичную (Kiev-у) функциональность используя не state machine, а ленивые выражения, раз они настолько
дешевы в .NET. В яве это выливается в создание anonymouse класса на каждое логическое условие, что я посчитал неприемлимым.
Для Namerle вы вполне можете использовать этот ход.
SOP & SymADE: http://symade.tigris.org , блог http://mkizub.livejournal.com
Re[11]: Логическое программирование в Nemerle?
От: mkizub Литва http://symade.tigris.org
Дата: 10.06.07 15:07
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>Здравствуйте, mkizub, Вы писали:


M>>Lazy код делает вычисление один раз. А backtrack-инг позволяет прервать вычисления, а потом продолжить их дальше, если необходимо. Они не взаимозаменяемы.

WH>А Lazy так и работает.
У тебя не lazy функция. Lazy делает вычисления один раз, а потом возвращает вычисленное значение. А твоя возвращает много значений, за счёт yield . Он и есть та фигня, которая сохраняет состояние функции, и продолжает вычисления после повторного входа.

M>>Замечательно, ты проверил, что "a" и прочие строки подходят. А теперь найди все строки, которые подходят.

WH>А я что делаю?
WH>Может будешь читать что написано, а не фантазировать.
WH>True/False говорит отдельная функция IsNotEmpty которая проверяет ечть в енумераторе что-то или нет.

Расслабься. Уже я ответил IO, что если обернуть каждое логическое условие в функцию, то так тоже можно постоить логический движок.

M>>pattern matching никакого улучшения по отношению к backtrack-ингу не имеет, потому что это просто разные вещи.

WH>А где я это сказал?
WH>Я сказал что pattern matching рулит при разработке компиляторов.
WH>Причем реально рулит и чемто другим его заменить очень не просто.

Ну я написал компилятор без него. Точнее, с multimethods, которые тоже в чём-то pattern matching.

WH>А вот твои логические изыски легко заменяются парой функций высшего порядка.


Ну, не так уж и легко. И потом, логическое программирование — это не мои изыски.
Ты что, хочешь мне доказать, что раз в Nemerle нет интеграции с логической парадигмой, то она и не нужна?
Я слышал подобные вещи сотни раз. Только там были утверждения, что раз в яве нет функциональной парадигмы,
то она нафиг не нужна. И аргументы были серъёзные — им не понадобилось ни разу.

WH>ЗЫ Следи за объемом цитирования. А то у меня уже появляется жилание добраться до банилки.


Там есть чек-бокс, совсем не функция высшего порядка — получать или нет уведомление по e-mail.
Не хочешь дальше обсуждать тему — тебя же никто силком не тянет.
SOP & SymADE: http://symade.tigris.org , блог http://mkizub.livejournal.com
Re[12]: [от модератора] Логическое программирование в Nemerl
От: Хитрик Денис Россия RSDN
Дата: 10.06.07 15:49
Оценка:
Здравствуйте, mkizub, Вы писали:

WH>>ЗЫ Следи за объемом цитирования. А то у меня уже появляется жилание добраться до банилки.

M>Там есть чек-бокс, совсем не функция высшего порядка — получать или нет уведомление по e-mail.
M>Не хочешь дальше обсуждать тему — тебя же никто силком не тянет.

WolfHound прав. Кроме чекбоксов есть и правила форума, которые обязаны соблюдать все посетители. Смотри пункт 3 здесь. Насчёт бана — всё совершенно серьёзно, к сожалению.
Правила нашего с вами форума.
Как правильно задавать вопросы. © 2001 by Eric S. Raymond; перевод: © 2002 Валерий Кравчук.
Re[12]: Логическое программирование в Nemerle?
От: WolfHound  
Дата: 10.06.07 15:51
Оценка: 14 (1)
Здравствуйте, mkizub, Вы писали:

M>У тебя не lazy функция. Lazy делает вычисления один раз, а потом возвращает вычисленное значение. А твоя возвращает много значений, за счёт yield .

http://nemerle.org/Lazy_evaluation
Или ты имеешь в виду макрос Memoize?
    Akkerman1(a : int, b: int) : int
    {
        if (b == 0)
            Akkerman1(a - 1, 1);
        else if (a == 0)
            b + 1;
        else
            Akkerman1(a - 1, Akkerman1(a, b - 1));
    }
        
    [Memoize]
    Akkerman2(a : int, b: int) : int
    {
        if (b == 0)
            Akkerman2(a - 1, 1);
        else if (a == 0)
            b + 1;
        else
            Akkerman2(a - 1, Akkerman2(a, b - 1));
    }
        
    public Main() : void
    {
        def watch = Stopwatch.StartNew();
        WriteLine(Akkerman1(3, 12));
        WriteLine(watch.Elapsed);

        def watch = Stopwatch.StartNew();
        WriteLine(Akkerman2(3, 12));
        WriteLine(watch.Elapsed);
    }

32765
00:00:05.3120469
32765
00:00:00.2155528


M>Он и есть та фигня, которая сохраняет состояние функции, и продолжает вычисления после повторного входа.

Эта фигня называется continuation.

M>Расслабься. Уже я ответил IO, что если обернуть каждое логическое условие в функцию, то так тоже можно постоить логический движок.

Прогресс. Недавно логический движок был чемто выдающимся.

M>Ну я написал компилятор без него. Точнее, с multimethods, которые тоже в чём-то pattern matching.

Фигня это, а не pattern matching.
Мультиметоды не могут разбирать сложные структуры которых в компиляторе много, а pattern matching легко.

M>Ну, не так уж и легко. И потом, логическое программирование — это не мои изыски.

M>Ты что, хочешь мне доказать, что раз в Nemerle нет интеграции с логической парадигмой, то она и не нужна?
Нет я хочу сказать что она просто не нужна.
Но если понадобится прикрутить не проблема.

Вон комуто понадобилась динамическая типизаця: http://nemerle.org/Late_Binding_Macro
Так что если комуто понадобится бэктрекинг то тоже сделать не проблема.

M>Там есть чек-бокс, совсем не функция высшего порядка — получать или нет уведомление по e-mail.

M>Не хочешь дальше обсуждать тему — тебя же никто силком не тянет.
Я хочу чтобы на форме был порядок.
Оверквотинг это не порядок.
... << RSDN@Home 1.2.0 alpha rev. 673>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[13]: Логическое программирование в Nemerle?
От: mkizub Литва http://symade.tigris.org
Дата: 10.06.07 16:10
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>Здравствуйте, mkizub, Вы писали:


M>>У тебя не lazy функция. Lazy делает вычисления один раз, а потом возвращает вычисленное значение. А твоя возвращает много значений, за счёт yield .

WH>http://nemerle.org/Lazy_evaluation
Ну да, там же именно это и написано. Значение вычисляется один раз, повторная попытка взять значение у lazy функции возвращает то-же самое значение.

WH>Или ты имеешь в виду макрос Memoize?

Не, его я не мог иметь в виду, поскольку перый раз о нём слышу.

M>>Он и есть та фигня, которая сохраняет состояние функции, и продолжает вычисления после повторного входа.

WH>Эта фигня называется continuation.

Не, continuation это другое. Сохранение состояния — это co-function. Continuation начинает исполнение каждый раз с начала,
с того места где его detach-нули.

M>>Расслабься. Уже я ответил IO, что если обернуть каждое логическое условие в функцию, то так тоже можно постоить логический движок.

WH>Прогресс. Недавно логический движок был чемто выдающимся.

Это что-то выдающееся я написал за 2 дня на своём нынешнем компиляторе. В первый раз это заняло 3 месяца.
Мне стало интересно — сколько это займёт на Nemerle. Как можно назвать выдающимся нечто, что написано
за 2 дня?
А вот сам способ совмещения императивной и логической парадигм, представленный в Kiev — это да, это
выдающееся.

M>>Ну я написал компилятор без него. Точнее, с multimethods, которые тоже в чём-то pattern matching.

WH>Фигня это, а не pattern matching.
WH>Мультиметоды не могут разбирать сложные структуры которых в компиляторе много, а pattern matching легко.

Правда? А то я не знал.
Серьёзно, ты меня за идиота считаешь?
Я написал, что мне их хватило. Потом, уже в теле одного метода, я доделывал остальные сравнения вручную,
императивно. Конечно pattern matching лучше. Но он тоже не всесилен. Некоторые места приходится
разбирать вручную.
Я тебе пример приведу. В JVM есть специальная инструкция для инкремента локальной переменной примитивного типа
при величине инкремента умещающегося в байт (от -127 до 128).
Ты это условие никаким pattern matching-ом не задашь.
А как мне станет совсем без него грустно (похоже, скоро уже станет) — я его добавлю.

M>>Там есть чек-бокс, совсем не функция высшего порядка — получать или нет уведомление по e-mail.

M>>Не хочешь дальше обсуждать тему — тебя же никто силком не тянет.
WH>Я хочу чтобы на форме был порядок.
WH>Оверквотинг это не порядок.

Ну ладно. Тогда я тоже пошёл жаловаться. Тут один Vlad2 круто нахамил, но я же не знал, что
можно сразу жаловаться. Буду как все, чего уж выделяться.
SOP & SymADE: http://symade.tigris.org , блог http://mkizub.livejournal.com
Re[14]: Логическое программирование в Nemerle?
От: WolfHound  
Дата: 10.06.07 16:51
Оценка:
Здравствуйте, mkizub, Вы писали:

WH>>Или ты имеешь в виду макрос Memoize?

M>Не, его я не мог иметь в виду, поскольку перый раз о нём слышу.
Ну посмотри насколько Akkerman2 быстрее отработал.
Все из-за того что Аккерман вызывается рекурсивно с часто повтрояюшимеся аргументами, а этот макрос создает кеш ключем в котором являются аргументы функции.
Уложилось это чудо в 80 строк.

M>Не, continuation это другое. Сохранение состояния — это co-function. Continuation начинает исполнение каждый раз с начала, с того места где его detach-нули.

Это спор о терминах.

M>Это что-то выдающееся я написал за 2 дня на своём нынешнем компиляторе. В первый раз это заняло 3 месяца.

M>Мне стало интересно — сколько это займёт на Nemerle. Как можно назвать выдающимся нечто, что написано за 2 дня?
Думаю теже пару дней (при том что я такого ниразу не писал). Только я этим заниматься не буду. Ибо нафиг не упало.

M>А вот сам способ совмещения императивной и логической парадигм, представленный в Kiev — это да, это выдающееся.

А по моему ничего интересного.

M>Правда? А то я не знал.

M>Серьёзно, ты меня за идиота считаешь?
Это ты сказал.

M>Я написал, что мне их хватило. Потом, уже в теле одного метода, я доделывал остальные сравнения вручную, императивно.

Ну компиляторы пишут на языках где нет мультиметодов и ничего... им тоже хватает...

M>Конечно pattern matching лучше. Но он тоже не всесилен. Некоторые места приходится разбирать вручную.

Пример в студию. Кроме динамического добавления образцов.

M>Я тебе пример приведу. В JVM есть специальная инструкция для инкремента локальной переменной примитивного типа при величине инкремента умещающегося в байт (от -127 до 128).

M>Ты это условие никаким pattern matching-ом не задашь.
Это почему еще?
Гарды в паттернматчинге никто не отменял.
А как ты будешь их делать на мультиметодах я не знаю.

M>А как мне станет совсем без него грустно (похоже, скоро уже станет) — я его добавлю.

Лично я без него за компилятор чего бы то нибыло не возьмусь вобще.
... << RSDN@Home 1.2.0 alpha rev. 673>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re: Логическое программирование в Nemerle?
От: VladD2 Российская Империя www.nemerle.org
Дата: 10.06.07 16:59
Оценка:
Здравствуйте, mkizub, Вы писали:

M>В Kiev compiler есть одна интересная фича — интегрированный логический под-язык


M>http://www.symade.org/kiev-263_4.html


M>Интересно, сколько времени займёт создание подобного по функциональности расширения языка на макросах Nemerle?


Сразу оговорюсь, что в ЛП я полный блаб. Знаю только (с чужих слов), что ЛП в общем, и Пролог в частности не имеет общего эффективного алгоритма реализации и по этому не может быть применен в при разработке сложного софта во всех областых программирования (применялся приемущественно в экспетрных системах).
Мои попытки изучить Пролог в своем время привели к тому, что я начал думать о Прологе как о некой СУБД, точнее о неком языке к этой БУБД. Как и многие другие применение для этого дела я так и не нашел и бросил.


Теперь ответ по сути... Время зависит от той сложности реализации, применяемых алгоритмов и прочей фигни. Насколько я знаю примитивные варианты Пролога реализуются очень просто. А вот такие чтобы их производительности хотя бы на что-то хватало сделать очень не просто. Единственое про что можно сказать сточно, так это про синтаксис. Это дело соврешенно не сложное. Прецеденты уже были. Например, на Немерле реализована EBNF-грамматика (точнее построитель парсеров граматика которого задается в виде макросов). Насколько я помню, после того как автор понял как это сделать, реализация у него много времени не заняла.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[9]: Логическое программирование в Nemerle?
От: VladD2 Российская Империя www.nemerle.org
Дата: 10.06.07 16:59
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>
WH>module Util
WH>{
WH>    public IsEmpty[T](this e : IEnumerable[T]) : bool
WH>    {
WH>        !IsNotEmpty(e);
WH>    }
WH>    public IsNotEmpty[T](this e : IEnumerable[T]) : bool
WH>    {
WH>        e.GetEnumerator().MoveNext();
WH>    }
WH>}

WH>[/code]

Кстати, хороший метод. Добавлю как я его в стандартную библиотеку :).
Только малость доработаю напильником:
[c#]
using System;
using System.Console;
using Nemerle.Utility;
using SCG = System.Collections.Generic;

module Ex
{
  public IsEmpty[T](this seq : array[T]) : bool { seq.Length == 0 }
  public IsEmpty(this seq : System.Collections.ICollection) : bool { seq.Count == 0 }
  
  public IsEmpty[T](this seq : SCG.IEnumerable[T]) : bool
  {
    | []                                    => true
    | _ :: _                                => false
    | ary is array[T]                       => IsEmpty(ary)
    | col is System.Collections.ICollection => IsEmpty(col)
    | _                                     => seq.GetEnumerator().MoveNext()
  }
}

module Program
{
  Main() : void
  {
    def print(seq) { WriteLine($"$(seq.GetType().Name): '..$(seq)' => $(seq.IsEmpty())") }
    print(array[1]);
    print(array(0));
    print([1]);
    print([1].Tail);
    print(SCG.List());
    print(SCG.List(array[1, 2]));
    _ = ReadLine();
  }
}


Вывод:
Int32[]: '1' => False
Int32[]: '' => True
Cons: '1' => False
Nil: '' => True
List`1: '' => True
List`1: '1, 2' => False

В реальной жизни такой вариант вообще оверхэда создавать не будет.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[10]: Логическое программирование в Nemerle?
От: VladD2 Российская Империя www.nemerle.org
Дата: 10.06.07 17:10
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>
VD>  public IsEmpty[T](this seq : SCG.IEnumerable[T]) : bool
VD>  {
VD>    | []                                    => true
VD>    | _ :: _                                => false
VD>    | ary is array[T]                       => IsEmpty(ary)
VD>    | col is System.Collections.ICollection => IsEmpty(col)
VD>    | _                                     => seq.GetEnumerator().MoveNext()
VD>  }
VD>}
VD>

Даже пожалуй так:
module Ex
{
  public IsEmpty   (this seq : System.Collections.ICollection) : bool { seq.Count == 0 }
  public IsEmpty[T](this seq : array[T])                       : bool { seq.Length == 0 }
  public IsEmpty[T](this seq : list[T])                        : bool
  {
    | []     => true
    | _ :: _ => false
    | null   => true
  }
  
  public IsEmpty[T](this seq : SCG.IEnumerable[T])             : bool
  {
    | []                                    => true
    | _ :: _                                => false
    | ary is array[T]                       => IsEmpty(ary)
    | col is System.Collections.ICollection => IsEmpty(col)
    | null                                  => true
    | _                                     =>
      foreach (_ in seq) // This for call IDisposable...
        Nemerle.Imperative.Return(false);
      true
  }
}
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[10]: Логическое программирование в Nemerle?
От: VladD2 Российская Империя www.nemerle.org
Дата: 10.06.07 17:43
Оценка:
Здравствуйте, mkizub, Вы писали:

M>Да, так будет работать. Есть два основных способа реализации логических программ —

M>1. state machine, которая сохраняет состояние метода после выхода из него, и продолжает с того-же места после повторного входа в него.
M>2. Оборачивание каждого условия в ленивую функцию и возврат получившегося ленивого выражения.
M>Вы можете написать аналогичную (Kiev-у) функциональность используя не state machine, а ленивые выражения, раз они настолько
M>дешевы в .NET.

Самое смешное, что сама функция FilterLazy() написана с использованием генеририуемого ДКА (state machine, как ты ее называешь) .
К дотнету это не относится. Это языковая фича. Есть в C# 2.0 и старше и в Немерле.

M> В яве это выливается в создание anonymouse класса на каждое логическое условие, что я посчитал неприемлимым.

M>Для Namerle вы вполне можете использовать этот ход.

На самом деле анонимые классы факктически ничего не стоият.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[3]: Логическое программирование в Nemerle?
От: VladD2 Российская Империя www.nemerle.org
Дата: 10.06.07 17:43
Оценка:
Здравствуйте, mkizub, Вы писали:

M>Могу выдать исходники генератора state machine, которые этим занимаются. Там не очень сложно.

M>http://www.symade.org/svn/symade/trunk/src/kiev/vlang/Rules.java
M>http://www.symade.org/svn/symade/trunk/src/kiev/ir/java15/RRules.java
M>Ещё есть альтернативный файлик
M>http://www.symade.org/svn/symade/trunk/src/kiev/ir/RuleTemplates.xml
M>но его без установки SymADE не просмотреть. Могу сделать дамп в явовские исходники, и выслать.

Тут проблема в том, что так как это особо никому из присуствующих не интересно, то и знаиматься этим никто не будет. Темболее, что для этого нужно понимать алгоритмы лежащие в осное.

Так что если хочешь можешь попробовать свои силы в Немерле и за одно сделать полезную вещь.


Дмаю, это поможет и тебе в твоей работе над супер-языком будущего, так как это реальный опыт в реально одной из лучших метасистем сегодняшнего дня.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[11]: Логическое программирование в Nemerle?
От: VladD2 Российская Империя www.nemerle.org
Дата: 10.06.07 17:43
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>А Lazy так и работает.

WH>Вот этот код превращается в класс содержащий конечный автомат.
WH>
WH>    public FilterLazy [T] (this source : SCG.IEnumerable [T], predicate : T -> bool) : SCG.IEnumerable [T]
WH>    {
WH>      foreach(elem when predicate(elem) in source)
WH>        yield elem;
WH>    }
WH>


Ага. На самом деле это не Lazy в полном понимании этого слова. Оно перевычисляется при каждом запуске.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[12]: Логическое программирование в Nemerle?
От: VladD2 Российская Империя www.nemerle.org
Дата: 10.06.07 17:52
Оценка:
Здравствуйте, mkizub, Вы писали:

M>У тебя не lazy функция. Lazy делает вычисления один раз, а потом возвращает вычисленное значение. А твоя возвращает много значений, за счёт yield . Он и есть та фигня, которая сохраняет состояние функции, и продолжает вычисления после повторного входа.


Совершенно верно. Это эдкакий усеченыый континюэшон. Просто назвать фукнцию FilterContinuation было бы и непонятнее, и длиннее.

M>Ну я написал компилятор без него. Точнее, с multimethods, которые тоже в чём-то pattern matching.


А если не сикрет, то где ты надыбла multimethod-ы?

WH>>А вот твои логические изыски легко заменяются парой функций высшего порядка.


M>Ну, не так уж и легко. И потом, логическое программирование — это не мои изыски.

M>Ты что, хочешь мне доказать, что раз в Nemerle нет интеграции с логической парадигмой, то она и не нужна?

Ну, я бы не отакзался иметь поддержку ЛП в вдие макроса . Как минимум убийственный аргумент при пенесометрии .

M>Я слышал подобные вещи сотни раз. Только там были утверждения, что раз в яве нет функциональной парадигмы,

M>то она нафиг не нужна. И аргументы были серъёзные — им не понадобилось ни разу.

Согласен. Аргумент блаба. Мол я не понимаю — значит никому не нужно. Деструктивная позиция.
В данном вопросе я предерживаюсь другой позиции: Если кто сделает, я буду ему очень благодарен, но свое врем тратить не буду. Слишком много других задач. Хотя задача чертовски интересная.

M>Там есть чек-бокс, совсем не функция высшего порядка — получать или нет уведомление по e-mail.

M>Не хочешь дальше обсуждать тему — тебя же никто силком не тянет.

Ты видимо плохо его понял. Это было предупреждение от модератора. Мне тоже показалось, что ты оверквотишь, только не настолько чтобы тебя за это по шапке давать. Так что будь добр быть немного акуратнее при цитировании.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[14]: Логическое программирование в Nemerle?
От: VladD2 Российская Империя www.nemerle.org
Дата: 10.06.07 17:52
Оценка:
Здравствуйте, mkizub, Вы писали:

M>Это что-то выдающееся я написал за 2 дня на своём нынешнем компиляторе. В первый раз это заняло 3 месяца.

M>Мне стало интересно — сколько это займёт на Nemerle. Как можно назвать выдающимся нечто, что написано
M>за 2 дня?
M>А вот сам способ совмещения императивной и логической парадигм, представленный в Kiev — это да, это
M>выдающееся.

Значит у тебя это займет не более двх дней и на Немерле (с оглядкой на неизвестный язык). С макросами могу проконсультировать если что. Так что попробуй, а мы тебе поможем.

А у нас это займет те же 3 месяца, так как мы задачу не знаем.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.