Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Языки программирования > Prolog
Перезагрузить страницу Исследуем язык программирования Mercury
Ответ
 
Опции темы Опции просмотра
  (#31 (permalink)) Старый
AD AD вне форума
Member
 
Сообщений: 575
Сказал(а) спасибо: 7
Поблагодарили 3 раз(а) в 3 сообщениях
Регистрация: 15.07.2009
По умолчанию 27.05.2010, 13:09

Цитата:
xonix, представьте пожалуйста результаты работы mercury на программе из Вашего сообщения №14, но по тестам из моей проги в этом сообщении.
Эх... Жаль, что xonix сдался и перестал отвечать. Очень интересно было читать это обсуждение....
Ответить с цитированием
  (#32 (permalink)) Старый
AD AD вне форума
Member
 
Сообщений: 575
Сказал(а) спасибо: 7
Поблагодарили 3 раз(а) в 3 сообщениях
Регистрация: 15.07.2009
По умолчанию 02.07.2010, 10:20

xonix, очень бы хотелось увидеть Ваш ответ. Жаль, что Вы забросили эту ветку... Но ответ, который бы точно описывал случаи, приведенные Винитархом. Заранее спасибо!
Ответить с цитированием
  (#33 (permalink)) Старый
xonix xonix вне форума
Member
 
Сообщений: 429
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 16.03.2007
По умолчанию 03.07.2010, 00:32

Цитата:
VIP5.x и старше так тоже умеют.
Не умеют. VIP 7.2 PE:

Код:
    run():-
        console::init(),
        
        X=Y, Z=Y, Z=Q, 123=Q,
        write(X),

        succeed(). % place your own code here
Результат:

Код:
c:\documents and settings\vovan\my documents\visual prolog projects\test2\main.pro(55,9) error c609: Variable 'X' is not completely bound
c:\documents and settings\vovan\my documents\visual prolog projects\test2\main.pro(55,11) error c609: Variable 'Y' is not completely bound
c:\documents and settings\vovan\my documents\visual prolog projects\test2\main.pro(55,14) error c609: Variable 'Z' is not completely bound
c:\documents and settings\vovan\my documents\visual prolog projects\test2\main.pro(55,21) error c609: Variable 'Q' is not completely bound
Цитата:
Мы же здесь уже выяснили, что есть ИСКЛЮЧАЮЩЕЕ_ИЛИ. А это и есть отсечение.
Не то Вы выяснили. В языке нету знака "!" и все! Но все возможности реализуемые через !, понятное дело, достижимы, только более правильным (идеологически) образом.

[quote]Пример не в тему. Так как надо сравнить один предикат с разными режимами детерминизма. Я в этой ветке Вас просил написать простенькую прогу, чтоб сравнить режим детерминизма:

Код:
:- module memb2.

:- interface.

:- import_module io.

:- pred main(io, io).
:- mode main(di, uo) is det.

:- implementation.

:- import_module list, solutions, int.

:- pred memb(T, list(T)).
:- mode memb(in, in) is semidet.
:- mode memb(out, in) is nondet.
memb(X,[X|_]).
memb(X,[_|L]):-memb(X,L).

:- pred print_ugu_on_every_N(T::in, list(T)::in, io::di, io::uo) is det.
print_ugu_on_every_N(N, [H | T]) -->
    ( {H = N} ->
      print("Ugu")
    ;
      []
    ),
    print_ugu_on_every_N(N, T).
print_ugu_on_every_N(_, []) --> [].

main -->
    ( { memb(6,[2,3,7,7]) } ->  print("Ugu") ; [] ), print("..."), nl,

    ( { memb(7,[2,3,7,7]) } ->  print("Ugu") ; [] ), print("..."), nl,

    print_ugu_on_every_N(6, [2,3,7,7]), print("..."), nl,

    print_ugu_on_every_N(7, [2,3,7,7]), print("..."), nl,

    io.write_list([2,3,7,7],"",io.write_int), print("...")

    .
Вывод:

Код:
...
Ugu...
...
UguUgu...
2377...
Как я уже говорил выше (а Вы, видимо, прослушали, иначе не задавали бы мне этот пример), failure-driven loops в mercury не возможны в силу чистоты и как следствие все побочные эффекты (ввод-вывод) надо отделять от чистого кода и оговаривать в типизации (сигнатуре).
Кроме того, Ваш код, хоть и показывает гибкость традиционных прологов, но по сути своей является как раз очень недекларативным, поскольку опирается на императивные особенности работы механизма перебора с возвратом, не говоря уже о том, что сложнее для понимания и более подвержен ошибкам.
Ответить с цитированием
  (#34 (permalink)) Старый
Винитарх Винитарх вне форума
Специалист
 
Аватар для Винитарх
 
Сообщений: 7,956
Сказал(а) спасибо: 2
Поблагодарили 303 раз(а) в 303 сообщениях
Регистрация: 01.03.2003
Адрес: Краснодар
По умолчанию 03.07.2010, 19:13

xonix, после Вашего самоубийственного поста можно было бы и не отвечать, и так всё видно.
Но прокомментировать я не удержусь.
[quote][i]Originally posted by xonix+-->[quote][quote][i]Originally posted by Винитарх+--><div class='codemain'>class predicates
member1 : (E,E*) nondeterm (i,i).
clauses
member1(X,[X|_]):-!.
member1(X,[_|L]):-member1(X,L).[/code]
Вот его аналог в Mercury:
Код:
:- pred memb(T, list(T)).
:- mode memb(in, in) is semidet.
:- mode memb(out, in) is nondet.
memb(X,[X|_]).
memb(X,[_|L]):-memb(X,L).
По моему поток memb(out, in) указан излишне, так как нигде не используется. Также видно, что названия режимов детерминизма в VIP и в Mercury не соответствуют друг другу.

2. Вот предикат в VIP7:
Код:
class predicates
member2 : (E,E*) nondeterm (i,i) (o,i).
clauses
member2(X,[X|_]).
member2(X,[_|L]):-member2(X,L).
Вот его существенно НЕполный аналог в Mercury:
Код:
:- pred print_ugu_on_every_N(T::in, list(T)::in, io::di, io::uo) is det.
print_ugu_on_every_N(N, [H | T]) -->
    ( {H = N} ->
      print("Ugu")
    ;
      []
    ),
    print_ugu_on_every_N(N, T).
print_ugu_on_every_N(_, []) --> [].
Вывод на экран введён внутрь предиката - видать без этого не получилось добиться сходства результатов на экране (кажущего сходства).
Предикат print_ugu_on_every_N не поддерживает поток (o,i), а именно на этом потоке я пробегаю по всем элементам списка, чтобы сделать поэлементный вывод на экран.
Для достижения внешнего сходства результатов и якобы функционального соответствия на выходе своей программы Вы, xonix, в цели просто взяли и вставили стандартный вывод списка io.write_list([2,3,7,7],"",io.write_int), print("...") Значит полный аналог недетерминированного member в Mercury написать нельзя.

Мои впечатления: Mercury - это обычный императивный детерминированный (1) язык с унификацией и отсутствием бэктрекинга (2). Аргументы:
(1) Все предикаты и клозы Mercury имеют отсечения, независимо от разделителя между ними (точка или точка с запятой), что даёт возможность не организовывать компилятору обременительный стек вызовов предикатов. Это естественно ускоряет Mercury-код, точно также как ускоряет и код любого императивного языка не обременённого недетерминизмом, в отличие от Пролога.
(2) Так как все клозы одного предиката связаны между собой операцией исключающее_или (и никак иначе), а тело предиката строится по принципу XOR_AND (и никак иначе), то бэктеркинг в таком языке не реализуем, да и не нужен по замыслу создателя языка. Значит вычислительная модель Mercury - детерминированная, => "Прощай недетерминизм Пролога и автоматический поиск в пространстве состояний"

Приобретения Mercury:
1) скорость на детерминированных задачах;
2) скорость на недетерминированных задачах, если поиск в пространстве состояний получится эффективно написать вручную.
Плата за эти приобретения:
1) многословность как у императивных языков;
2) невозможность писать недетерминированные программы;
3) написание программ только в рамках XOR_AND - дерева;
3) отсутствие встроенного в язык поиска на дереве решений и как следствие невозможность использования автоматического поиска в пространстве состояний.
На мой взгляд плата высока.

Мой вывод: Mercury - уже не Пролог, но ещё не Бейсик. Если убрать и унификацию, то получится код ещё быстрее, и это будет уже Бейсик.
Ответить с цитированием
  (#35 (permalink)) Старый
xonix xonix вне форума
Member
 
Сообщений: 429
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 16.03.2007
По умолчанию 03.07.2010, 19:42

Цитата:
xonix, после Вашего самоубийственного поста можно было бы и не отвечать, и так всё видно.
Но прокомментировать я не удержусь.

Не умеют. VIP 7.2 PE:
xonix, старше - это значит старше, а не моложе. Поэтому VIP5.2 и старше так делать умеют. А VIP7 действительно именно так не умеет, так как всем известно, что в VIP7 используется не унификация, а сопоставление с образцом.
My fault. Но я потому и сравниваю именно Mercury vs VIP 7, т.к. эти два языка удаляются от пролога в весьма похожем направлении.

Цитата:
Послушайте, милейший, мы же не значки сравниваем, а парадигмы. В VIP статическое отсечение указывается предикатом cut или его сахарным вариантом "!" (в VIP есть также и динамическое отсечение). В Mercury отсечение явно не указывается, но подразумевается везде, где стоит точка с запятой ";" или просто точка. И не морочьте мозги окружающим.
Ок, повторяю еще раз. В предикате с детерминизмом det, semidet точка с запятой ";" понимается компилятором как исключающее_или. В предикатах с детерминизмом nondet, multi точка с запятой ";" понимается компилятором как неисключающее_или (тот самый прологовский перебор с возвратом).

Цитата:
Вывод на экран введён внутрь предиката - видать без этого не получилось добиться функционального сходства.
Предикат print_ugu_on_every_N не поддерживает поток (o,i), а именно на этом потоке я пробегаю по всем элементам списка, чтобы сделать поэлементный вывод на экран.
Для достижения внешнего сходства результатов и якобы функционального соответствия на выходе своей программы Вы, xonix, в цели просто взяли и вставили стандартный вывод списка io.write_list([2,3,7,7],"",io.write_int), print("...") Значит полный аналог недетерминированного member в Mercury написать нельзя.
И вновь поясняю. Недетерминированный вариант member написать можно, более того, примеры приводились выше, но недетерминированный member невозможно сочленить с вводом-выводом, который обязан быть детерминированным. Поэтому, строго говоря, полный аналог Вашего кода в mercury невозможно написать by design, просто потому что он строже.

Цитата:
Мои впечатления: (...)
Доля правды есть, если сделать поправку на грубые ошибки в понимании концепции. Доля правды вот в чем: mercury нацелен на ограничение недетерминизма, там где это возможно, достаточно сказать что в компиляторе меркури доля недетерминированных предикатов не превышает нескольких процентов. Поэтому, пожалуй соглашусь с тем, что это более функциональный язык чем язык логического программирования.
Ответить с цитированием
Ads.
  (#36 (permalink)) Старый
Винитарх Винитарх вне форума
Специалист
 
Аватар для Винитарх
 
Сообщений: 7,956
Сказал(а) спасибо: 2
Поблагодарили 303 раз(а) в 303 сообщениях
Регистрация: 01.03.2003
Адрес: Краснодар
По умолчанию 03.07.2010, 19:58

Вооо. Вот это уже по делу.
Цитата:
Originally posted by xonix
[b]В предикате с детерминизмом det, semidet точка с запятой ";" понимается компилятором как исключающее_или.
Вот сейчас ясно и понятно.
Цитата:
Originally posted by xonix
[b]В предикатах с детерминизмом nondet, multi точка с запятой ";" понимается компилятором как неисключающее_или (тот самый прологовский перебор с возвратом).
А вот здесь опять не понятно. Вы писали, что failure-driven циклов нет. А откаты всё же есть? А что мешает сделать циклы с откатом?
Цитата:
Originally posted by xonix
[b]полный аналог Вашего кода в mercury невозможно написать by design, просто потому что он строже.
И это ещё одна плата за скорость - строгость языка. А Вы говорили, что он более декларативен. Скорее всего он более строг и ставит программиста в жёсткие рамки.
Ответить с цитированием
Ads
  (#37 (permalink)) Старый
xonix xonix вне форума
Member
 
Сообщений: 429
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 16.03.2007
По умолчанию 03.07.2010, 20:03

Цитата:
А вот здесь опять не понятно. Вы писали, что failure-driven циклов нет. А откаты всё же есть? А что мешает сделать циклы с откатом?
То, что слово цикл логическому и тем более функциональному стилю программирования (должно быть) чуждо. Есть только рекурсия.

Цитата:
И это ещё одна плата за скорость - строгость языка. А Вы говорили, что он более декларативен. Скорее всего он более строг и ставит программиста в жёсткие рамки.
Противоречия нет. Более строгий язык делает код на нём более декларативным.
Ответить с цитированием
  (#38 (permalink)) Старый
Винитарх Винитарх вне форума
Специалист
 
Аватар для Винитарх
 
Сообщений: 7,956
Сказал(а) спасибо: 2
Поблагодарили 303 раз(а) в 303 сообщениях
Регистрация: 01.03.2003
Адрес: Краснодар
По умолчанию 03.07.2010, 20:18

Цитата:
Более строгий язык делает код на нём более декларативным.
Интересный ход. Значит строгость - показатель декларативности, и АДА - самый декларативный язык!
Судя по всему наступил конец обсуждению: в Mercury унификация есть, откаты есть, отсечения фактически есть, но указываются в декларативной части программы для всего объявляемого предиката целиком, repeat-fail циклов нет. Предикаты пишутся либо в стиле OR_AND - дерева, либо в стиле XOR_AND - дерева. За скорость заплачена мзда - многословность, ограниченность языка рамками заявленной "чистоты".

p.s. Совсем упустил из виду. А как насчёт добавления и удаления фактов и правил?
Ответить с цитированием
  (#39 (permalink)) Старый
Сергей Пеньков Сергей Пеньков вне форума
Member
 
Сообщений: 351
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 17.06.2003
По умолчанию 04.07.2010, 08:57

Цитата:
p.s. Совсем упустил из виду. А как насчёт добавления и удаления фактов и правил?
Такое ощущение, что мое появление (как едиственного русско-говорящего представителя родины Меркурия) всячески стимулирет дискуссию об этом замечательном проекте.
Винитарх - про факты и правила - удар ниже пояса, как и любой вопрос про самообучающиеся системы в проекте Меркурий.
Ответить с цитированием
  (#40 (permalink)) Старый
xonix xonix вне форума
Member
 
Сообщений: 429
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 16.03.2007
По умолчанию 04.07.2010, 16:26

Цитата:
Интересный ход. Значит строгость - показатель декларативности, и АДА - самый декларативный язык!
Разумеется, я имел в виду только контекст пролог-образных языков :-)
Цитата:
Судя по всему наступил конец обсуждению: в Mercury унификация есть, откаты есть, отсечения фактически есть, но указываются в декларативной части программы для всего объявляемого предиката целиком, repeat-fail циклов нет. Предикаты пишутся либо в стиле OR_AND - дерева, либо в стиле XOR_AND - дерева. За скорость заплачена мзда - многословность, ограниченность языка рамками заявленной "чистоты".
Думаю, теперь весьма близко к истине :-)
Цитата:
p.s. Совсем упустил из виду. А как насчёт добавления и удаления фактов и правил?
Этого нету :clever:
Ответить с цитированием
  (#41 (permalink)) Старый
Alison Alison вне форума
Member
 
Сообщений: 4,781
Сказал(а) спасибо: 0
Поблагодарили 119 раз(а) в 116 сообщениях
Регистрация: 17.11.2004
По умолчанию 04.07.2010, 17:43

Цитата:
Этого нету :clever:
Тогда и смысла никакого нет сравнивать его с VIP, хоть 7.x, хоть с более ранними версиями. Да и вообще, это (assert/retract) есть, наверное, во всех реализациях Пролога, но раз Mercury не Пролог, чего уж там.

Итого: все, что говорилось с самого начала оппонентами xonix'a, подтвердилось, и не раз, и надеюсь, теперь стало яснее многим.

Mercury и Visual Prolog не движутся в одном направлении.

Кстати, с тем же успехом Вы можете его сравнивать со SWI, ведь и там, и там есть DCG. :-)

Но и это, конечно, тоже бессмысленно. Так что все обсуждение идет по кругу. И сколько бы раз ни утверждалось обратное, Mercury не выглядит декларативнее VIP. Внешние общие черты видны, но они не должны вводить в заблуждение.
Ответить с цитированием
  (#42 (permalink)) Старый
Сергей Пеньков Сергей Пеньков вне форума
Member
 
Сообщений: 351
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 17.06.2003
По умолчанию 04.07.2010, 17:50

Цитата:
Этого нету :clever:
Давно и не новость. И при всем при этом, Mercury-таки, рвет VIP.
Как тузик - грелку.
Ответить с цитированием
  (#43 (permalink)) Старый
xonix xonix вне форума
Member
 
Сообщений: 429
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 16.03.2007
По умолчанию 04.07.2010, 18:36

Цитата:
Тогда и смысла никакого нет сравнивать его с VIP, хоть 7.x, хоть с более ранними версиями. Да и вообще, это (assert/retract) есть, наверное, во всех реализациях Пролога, но раз Mercury не Пролог, чего уж там.
assert-retract это фигня, на что-либо большее, чем образовательные примеры (и то, не лучший вариант), имхо, не годное. Куда правильнее использовать интерфейс к каким-нибудь более продвинутым системах хранения данных, к примеру, обычные РСУБД. Более того, Вам, как преподавателю пролога лучше меня должно быть известно, что assert-retract - отнюдь не лучший стиль кодирования на prolog. Чтоб не быть голословным, приведу цитату из книги И. Братко:

Цитата:
Здесь следует сделать одно замечание, относящееся к стилю программирования. Приведенные примеры показали некоторые явно полезные применения assert и retract. Однако использование этих отношений требует особой внимательности. Не рекомендуется применять их слишком часто и без должной осторожности - это плохой стиль программирования. Ведь добавляя и удаляя предложения, мы фактически изменяем программу. Поэтому отношения, выполнявшиеся в некоторой ее точке, могут оказаться неверными в другой. В разные моменты времени ответы на одни и те же вопросы будут различными. Таким образом, большое количество обращений к assert и retract может затемнить смысл программы и станет трудно разобрать, что истинно, а что - нет. В результате поведение программы может стать непонятным, трудно объяснимым, и вряд ли можно будет ей доверять.
Цитата:
Итого: все, что говорилось с самого начала оппонентами xonix'a, подтвердилось, и не раз, и надеюсь, теперь стало яснее многим.
Ну-ну. Вы забываете (или умалчиваете) о куда более важном аспекте. И VIP 7 и Mercury лишены полноценной логической унификации.
Ответить с цитированием
  (#44 (permalink)) Старый
Alison Alison вне форума
Member
 
Сообщений: 4,781
Сказал(а) спасибо: 0
Поблагодарили 119 раз(а) в 116 сообщениях
Регистрация: 17.11.2004
По умолчанию 04.07.2010, 19:31

Цитата:
assert-retract это фигня, на что-либо большее, чем образовательные примеры (и то, не лучший вариант), имхо, не годное.
Я бы так не сказала, дело полезное. Даже в VIP, несмотря на то, что там есть средства для хранения и быстрого доступа к данным. Многие задачи без этого решать гораздо хуже, и Пролог без этого не даст выигрыша по сравнению с другими языками.
Цитата:
Куда правильнее использовать интерфейс к каким-нибудь более продвинутым системах хранения данных
В VIP есть ODBC.
Цитата:
Более того, Вам, как преподавателю пролога лучше меня должно быть известно, что assert-retract - отнюдь не лучший стиль кодирования на prolog.
Если есть возможность сделать изящно без этого - конечно. Но есть задачи, которые лучше делать как раз с помощью внутренних БД. Тем более, в учебных целях без этого не обойтись, если говорить о чем-то более серьезном, чем решение миниатюрных упражнений.
Цитата:
Ну-ну. Вы забываете (или умалчиваете) о куда более важном аспекте. И VIP 7 и Mercury лишены полноценной логической унификации.
Да ладно. Эта "полноценная" унификация нужна гораздо реже, чем об этом говорится. Тем более, что в VIP сейчас без напряга можно использовать PIE и соединять возможности типизированных и нетипизированных реализаций Пролога (компилятора и интерпретатора), без каких-либо дополнительных телодвижений.
Ответить с цитированием
  (#45 (permalink)) Старый
Винитарх Винитарх вне форума
Специалист
 
Аватар для Винитарх
 
Сообщений: 7,956
Сказал(а) спасибо: 2
Поблагодарили 303 раз(а) в 303 сообщениях
Регистрация: 01.03.2003
Адрес: Краснодар
По умолчанию 05.07.2010, 00:09

Цитата:
Originally posted by xonix
[b]Этого нету
Понятно - ещё одна плата за скорость. Авторам же Меркурия надо было строго следовать заявленной чистоте языка. Получился чистый в математическом пониманиии Пролог, навроде Хаскеля в функциональных языках. "Вычищенные" предикаты ввода/вывода Меркурия напоминают монады Хаскеля. Две беды - ни в учебном процессе использовать (требованиям ГОС ВПО он не удовлетворяет), ни в коммерческом программировании (нет необходимого окружения - IDE, DBG ...). Хотя можно и использовать, но на мой взгляд не стоит. Ради никому не нужной чистоты язык выхоластили (опустошили). Получили скорость. Однако, кому нужна скорость - те пишут на С++.

Ломающим копья по поводу набора парадигм Языка логического программирования: ни унификация, ни бэктрекинг, ни внутрення БД ни коим образом не являются "лакмусовыми бумажками" Пролога. Это просто вкусности. Поэтому предлагаю не ломать копия по этому поводу (хотя ради повышения рейтинга форума можно и эту тему помусолить).
Ответить с цитированием
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Самый крутой язык программирования Garik Мысли вслух 7103 08.08.2016 13:00
Язык программирования Gwai Prolog 8 17.05.2011 13:42
[ANN] [Mercury] Новый блог по mercury xonix Prolog 0 05.04.2011 14:06
Какой язык программирования выбрать St.Ark Вопросы начинающих программистов 30 16.03.2011 18:58
Разрабатываю язык логического программирования. prokopiy Prolog 71 11.08.2010 22:05
Как создать новый язык программирования на С++ Шоколад Вопросы начинающих программистов 6 15.10.2009 22:52
Язык программирования Barsic Blan Форум программистов 1 22.03.2008 10:26
язык программирования Матрикс Форум программистов 1 07.06.2007 19:16
Скрипт или язык программирования GEV_256 Мысли вслух 24 09.01.2006 01:54
Язык программирования Loid Мысли вслух 17 29.05.2005 23:20
Скриптовый язык vs Язык программирования relonar Мысли вслух 4 24.09.2004 02:14



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Нardforum.ru - компьютерный форум и программирование, форум программистов