Логическое программирование в Nemerle?
От: mkizub Литва http://symade.tigris.org
Дата: 10.06.07 10:01
Оценка:
В Kiev compiler есть одна интересная фича — интегрированный логический под-язык

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

Интересно, сколько времени займёт создание подобного по функциональности расширения языка на макросах Nemerle?
SOP & SymADE: http://symade.tigris.org , блог http://mkizub.livejournal.com
Re: Логическое программирование в Nemerle?
От: WolfHound  
Дата: 10.06.07 10:32
Оценка:
Здравствуйте, mkizub, Вы писали:

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

А нафига? Я так и не понял к чему этот язычек?
Что он дает?
Те примеры что в статье мягко говоря не убедительны.

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

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

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

WH>Пока не ясно что и как на вопрос не ответить.


Ты про Prolog слышал? Про логическую парадигму программирования слышал? Так вот это прямой аналог,
несколько изменённый для интеграции с процедурным кодом.

Вот про Nemerle пишут — объединяет в себе процедурное и функциональное программирование. Если вы напишите на
макросах аналог логического движка в Kiev-е, то смело можете писать — объединяет в себе процедурную,
функциональную и логическую парадигмы программирования.
SOP & SymADE: http://symade.tigris.org , блог http://mkizub.livejournal.com
Re: Логическое программирование в Nemerle?
От: _pk_sly  
Дата: 10.06.07 11:08
Оценка:
на сколько я понял, всё что надо сделать — заменить запятую на AND, а точку с запятой на OR :)

из примера никакой "логики" не видно.
Re[2]: Логическое программирование в Nemerle?
От: mkizub Литва http://symade.tigris.org
Дата: 10.06.07 11:20
Оценка: :))) :)
Здравствуйте, _pk_sly, Вы писали:

__>на сколько я понял, всё что надо сделать — заменить запятую на AND, а точку с запятой на OR


__>из примера никакой "логики" не видно.


Народ, ну почитайте Prolog. Его же в любом институте преподают, не считая того, что эту парадигму
должен знать любой профессиональный программист, пусть хотя бы в ознакомительном плане.
Prolog позволяет искать решения. У него есть понятие backtrack. Напрмер, в коде


String[] arr = {"a", "bb", "c", "dd", "e"};
...
rule find(pvar String str, int i)
{
  str @= arr,
  str.length() <= i
}

foreach(String s; find(s, 1))
 print(s);


Будет напечатано "a", "с", "e".

В моём коде один и тот-же rule метод позволяет как делать resolving переменной по имени, так и находить
все переменные начинающиеся на определённую строку (для реализации авто-дополнения в IDE).

Всё, кто про Prolog не слышал — могут идти мимо темы, без своих умных комментариев, что они ничего
не поняли.
SOP & SymADE: http://symade.tigris.org , блог http://mkizub.livejournal.com
Re[3]: Логическое программирование в Nemerle?
От: WolfHound  
Дата: 10.06.07 11:31
Оценка: -1
Здравствуйте, mkizub, Вы писали:

M>Ты про Prolog слышал? Про логическую парадигму программирования слышал?

Слышал. Даже немного игрался.
Говорят неплохо решает очень узкий круг задач при этом как работают большие программы на нем как правило не понимает никто включая автора.

M>Так вот это прямой аналог,несколько изменённый для интеграции с процедурным кодом.

А нафига?
Можешь привести пример того где это реально облегчило жизнь?

M>Вот про Nemerle пишут — объединяет в себе процедурное и функциональное программирование. Если вы напишите на макросах аналог логического движка в Kiev-е, то смело можете писать — объединяет в себе процедурную, функциональную и логическую парадигмы программирования.

Я это точно писать не буду.
Ибо считаю это бесполезной игрушкой.
Попробй доказать обратное ибо примеры в статье мягко говоря не убеждают в полезности этой примочки.
... << RSDN@Home 1.2.0 alpha rev. 673>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[3]: Логическое программирование в Nemerle?
От: WolfHound  
Дата: 10.06.07 11:45
Оценка:
Здравствуйте, mkizub, Вы писали:

M>
M>String[] arr = {"a", "bb", "c", "dd", "e"};
M>...
M>rule find(pvar String str, int i)
M>{
M>  str @= arr,
M>  str.length() <= i
M>}

M>foreach(String s; find(s, 1))
M> print(s);
M>


M>Будет напечатано "a", "с", "e".


using System.Console;

def arr = ["a", "bb", "c", "dd", "e"];

def find(i)
{
    arr.Filter(s => s.Length <= i);
}

foreach (s in find(1))
    WriteLine(s);

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

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


M>>
M>>String[] arr = {"a", "bb", "c", "dd", "e"};
M>>...
M>>rule find(pvar String str, int i)
M>>{
M>>  str @= arr,
M>>  str.length() <= i
M>>}

M>>foreach(String s; find(s, 1))
M>> print(s);
M>>


M>>Будет напечатано "a", "с", "e".


WH>
WH>using System.Console;

WH>def arr = ["a", "bb", "c", "dd", "e"];

WH>def find(i)
WH>{
WH>    arr.Filter(s => s.Length <= i);
WH>}

WH>foreach (s in find(1))
WH>    WriteLine(s);
WH>

WH>Ну и нафига козе боян?

String[] arr = {"a", "bb", "c", "dd", "e"};
...
rule find(pvar String str, int i)
{
  str @= arr,
  str.length() <= i
}

foreach(String@ s; find(s, 1))
 print(s);
String@ bb = "bb";
if (find(s,s.length()))
 print("OK");
String@ cc = "cc";
if (find(s,s.length()))
 print("FAIL");
SOP & SymADE: http://symade.tigris.org , блог http://mkizub.livejournal.com
Re[3]: Логическое программирование в Nemerle?
От: _pk_sly  
Дата: 10.06.07 12:06
Оценка:
Да я немного вкурсе насчёт пролога.

Только данные примеры не имеют совершенно никакого отношения ни к прологу, ни к логическому программированию.

Если будут подходящие примеры, будет о чём говорить. Уж извините, но простые предикаты сейчас можно легко реализовать на любом современном императивном языке.
Re: Логическое программирование в Nemerle?
От: Андрей Хропов Россия  
Дата: 10.06.07 12:27
Оценка: +1
Здравствуйте, mkizub, Вы писали:

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


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


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


Да в общем-то не слишком много, наверное. По крайней мере, ИМХО, Немерле — лучший инструмент для написания такого рода расширений.

Основная проблема же "думатель" хороший написать.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[5]: Логическое программирование в Nemerle?
От: WolfHound  
Дата: 10.06.07 12:27
Оценка:
Здравствуйте, mkizub, Вы писали:

M>
M>String[] arr = {"a", "bb", "c", "dd", "e"};
M>...
M>rule find(pvar String str, int i)
M>{
M>  str @= arr,
M>  str.length() <= i
M>}

M>foreach(String@ s; find(s, 1))
M> print(s);
M>String@ bb = "bb";
M>if (find(s,s.length()))
M> print("OK");
M>String@ cc = "cc";
M>if (find(s,s.length()))
M> print("FAIL");
M>

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

__>Да я немного вкурсе насчёт пролога.

__>Только данные примеры не имеют совершенно никакого отношения ни к прологу, ни к логическому программированию.
__>Если будут подходящие примеры, будет о чём говорить. Уж извините, но простые предикаты сейчас можно легко реализовать на любом современном императивном языке.

Ну так и примеры простые, чтоб можно было поднапрячься и понять.
Поиск решения невозможен без backtrack-инга. Ничего подобного в императивных языках нет.
WolfHound предложил решение простым составлением списка всех вариантов и возврата этого списка.
Не говоря уже о том, что такой список может быть бесконечным, и его алгоритм никогда не вернёт
решений — но такой подход и просто мало эффективен. Как правило, нужно только первое решение.
Но иногда нужны и все, или первые сто или ещё как.
Этот логический движок — одно из самых используемых расширений в моём компиляторе.
И для резолвинга имён, и тот-же код для автодополнения имён в IDE — потому что это
один и тот-же набор правил.
И для парсинга выражений с задаваемых пользователями операторами с разными приоритетами.
Собственно Prolog и был написан для парсинга грамматик где требовался backtrac-инг.

Конечно, это можно написать императивно. Видал я такие компиляторы. Только потом там
поменять что-то почти невозможно. Логическая парадигма — потому и отдельная, что через
императивную не выражается.
SOP & SymADE: http://symade.tigris.org , блог http://mkizub.livejournal.com
Re[6]: Логическое программирование в Nemerle?
От: mkizub Литва http://symade.tigris.org
Дата: 10.06.07 12:41
Оценка:
Здравствуйте, WolfHound, Вы писали:

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


M>>
M>>String[] arr = {"a", "bb", "c", "dd", "e"};
M>>...
M>>rule find(pvar String str, int i)
M>>{
M>>  str @= arr,
M>>  str.length() <= i
M>>}

M>>foreach(String@ s; find(s, 1))
M>> print(s);
M>>String@ bb = "bb";
M>>if (find(s,s.length()))
M>> print("OK");
M>>String@ cc = "cc";
M>>if (find(s,s.length()))
M>> print("FAIL");
M>>

WH>И откуда find узнал о bb и cc?

Сорри, copy&paste. Конечно find(bb,bb.length()) и find(cc,cc.length())

WH>Можно ли воспользоваться bb после объявления cc?


Можно, конечно. Только напрямую сделать
String@ bb = "bb";
bb = "cc";
нельзя, потому как на самом деле String@ это PVar<String>, у которого переопределён оператор присваивания — он проверит, что текущее содержимое "bb" не равно "cc" и вернёт false.
Можно
String@ bb = "bb";
bb.$unbind();
bb = "cc";

И было-бы неплохо, чтоб find возвращал не все возможные решения, а по одному. А то если все сразу — это на практике будет очень долго.
SOP & SymADE: http://symade.tigris.org , блог http://mkizub.livejournal.com
Re[2]: Логическое программирование в Nemerle?
От: mkizub Литва http://symade.tigris.org
Дата: 10.06.07 12:48
Оценка:
Здравствуйте, Андрей Хропов, Вы писали:

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


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


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


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


АХ>Да в общем-то не слишком много, наверное. По крайней мере, ИМХО, Немерле — лучший инструмент для написания такого рода расширений.


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


Могу выдать исходники генератора state machine, которые этим занимаются. Там не очень сложно.
http://www.symade.org/svn/symade/trunk/src/kiev/vlang/Rules.java
http://www.symade.org/svn/symade/trunk/src/kiev/ir/java15/RRules.java
Ещё есть альтернативный файлик
http://www.symade.org/svn/symade/trunk/src/kiev/ir/RuleTemplates.xml
но его без установки SymADE не просмотреть. Могу сделать дамп в явовские исходники, и выслать.
SOP & SymADE: http://symade.tigris.org , блог http://mkizub.livejournal.com
Re[5]: Логическое программирование в Nemerle?
От: _pk_sly  
Дата: 10.06.07 12:58
Оценка:
M> Логическая парадигма — потому и отдельная, что через
M>императивную не выражается.

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

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

Таки ждём удачного примера, для чего это надо.
Re[5]: Логическое программирование в Nemerle?
От: WolfHound  
Дата: 10.06.07 13:01
Оценка:
Здравствуйте, mkizub, Вы писали:

M>Ну так и примеры простые, чтоб можно было поднапрячься и понять.

В том то и дело что на этих примерах не видно выгоды от подхода.

M>Поиск решения невозможен без backtrack-инга.

Да ну?! Он что превосходит по возможности машину Тьюринга? И как же он тогда работает на современном железе?

M>Ничего подобного в императивных языках нет.

А надо?
К тому же есть еще и функциональные языки. И гибриды. Там есть болие другие способы декомпозиции чем в какойнибудь убогой жабке.

M>WolfHound предложил решение простым составлением списка всех вариантов и возврата этого списка.

Был конкретный пример. Я его конкретно переписал.

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

M>Но иногда нужны и все, или первые сто или ещё как.
Есть FilterLazy.

M>Этот логический движок — одно из самых используемых расширений в моём компиляторе.

M>И для резолвинга имён, и тот-же код для автодополнения имён в IDE — потому что это один и тот-же набор правил.
M>И для парсинга выражений с задаваемых пользователями операторами с разными приоритетами.
M>Собственно Prolog и был написан для парсинга грамматик где требовался backtrac-инг.
И с какой скоростью это работает? backtrac-инг штука не быстрая.

M>Конечно, это можно написать императивно. Видал я такие компиляторы. Только потом там поменять что-то почти невозможно. Логическая парадигма — потому и отдельная, что через императивную не выражается.

Небось на какомнибудь С++ или жабе?

Я к сожелению еще не копался в немерловом компиляторе но тут есть люди которые его основательно пописали... думаю тебе скоро объяснят как это сделано там.
... << RSDN@Home 1.2.0 alpha rev. 673>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[7]: Логическое программирование в Nemerle?
От: IO Украина  
Дата: 10.06.07 13:12
Оценка:
Здравствуйте, mkizub, Вы писали:

M>И было-бы неплохо, чтоб find возвращал не все возможные решения, а по одному. А то если все сразу — это на практике будет очень долго.

Мне тоже интересно, можно ли тут прикрутить ленивое вычисление.

using System.Console;

[Record]
class Str
{
    s : string;
    public GetS(context: string) : string
    {
        WriteLine($"Getting \"$s\" in {0}", context);
        s;
    };
}

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

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

foreach (s in find(1))
    WriteLine(s.GetS("foreach cycle"));


--
И еще хочу подсветку Немерл-кода на сайте.
Re[6]: Логическое программирование в Nemerle?
От: IO Украина  
Дата: 10.06.07 13:17
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>Есть FilterLazy.



using System.Console;
using Nemerle.Utility;

[Record]
class Str
{
    s : string;
    public GetS(context: string) : string
    {
        WriteLine($"Getting \"$s\" in {0}", context);
        s;
    };
}

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

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

foreach (s in find(1))
    WriteLine(s.GetS("foreach cycle"));



Getting "a" in find()
Getting "a" in foreach cycle
a
Getting "bb" in find()
Getting "c" in find()
Getting "c" in foreach cycle
c
Getting "dd" in find()
Getting "e" in find()
Getting "e" in foreach cycle
e

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

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


WH>>Есть FilterLazy.

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 {0}", context);
IO>        s;
IO>    };
IO>}

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

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

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



IO>

IO>Getting "a" in find()
IO>Getting "a" in foreach cycle
IO>a
IO>Getting "bb" in find()
IO>Getting "c" in find()
IO>Getting "c" in foreach cycle
IO>c
IO>Getting "dd" in find()
IO>Getting "e" in find()
IO>Getting "e" in foreach cycle
IO>e


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

String[] arr_foo = {"a", "b", "c"};
rule foo(String@ s)
{
  s @= arr_foo
}
String[] arr_bar = {"b", "c", "d"};
rule bar(String@ s)
{
  foo(s) ,
  s @= arr_bar
}

Здесь вначале ищется решение в правиле foo, потом проверятся удовлетворяет ли оно дополнительным правилам в bar, и если нет — надо возвращаться и искать следующее решение в foo.
Если на практике, то это может быть foo — поиск поля в классе, а bar — проверка того, что это поле не приватное для того класса. А если мы ищем поле в своём классе — то вызваем
непосредственно foo, потому как мы имеем доступ к приватным полям.
SOP & SymADE: http://symade.tigris.org , блог http://mkizub.livejournal.com
Re[3]: Логическое программирование в Nemerle?
От: Курилка Россия http://kirya.narod.ru/
Дата: 10.06.07 13:36
Оценка:
Здравствуйте, mkizub, Вы писали:

M>Здравствуйте, Андрей Хропов, Вы писали:


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


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


Стоп, какие стейт-машины, тыж говоришь логические условия через имеративные не выражаются?
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.