Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Языки программирования > Prolog
Перезагрузить страницу Исследуем язык программирования Mercury
Ответ
 
Опции темы Опции просмотра
  (#16 (permalink)) Старый
xonix xonix вне форума
Member
 
Сообщений: 429
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 16.03.2007
По умолчанию 27.04.2010, 17:21

Цитата:
Зато язык интересный, и компилятор крутой :drink:
Ответить с цитированием
  (#17 (permalink)) Старый
Винитарх Винитарх вне форума
Специалист
 
Аватар для Винитарх
 
Сообщений: 7,956
Сказал(а) спасибо: 2
Поблагодарили 303 раз(а) в 303 сообщениях
Регистрация: 01.03.2003
Адрес: Краснодар
По умолчанию 28.04.2010, 19:03

Цитата:
Originally posted by xonix+-->
Цитата:
Думаю, в его академичности, и как следствие - малоразвитость (это еще слабовато сказано) средств разработки.
Я не об этом. Я о том, что если он быстрее на каких-то задачах, то за счёт чего? Чем было пожертвовано в языке, чтобы код стал быстрее?
Я не думаю, что причина кроется в том, что разработчики компилятора Mercury более умнее разработчиков компилятора VIP.

Цитата:
Originally posted by xonix+-->
Цитата:
semidet (это determ в VIP)
Мне кажется, что это не так. Ибо:
Цитата:
Originally posted by xonix
[b]:- mode member_nondet(in, in) is semidet.
Вот здесь ошибка: semidet не есть determ в VIP.

Код:
member_semidet(X, [Y|L]) :-
    ( X = Y
    ; member_semidet(X, L)
    ).
Как я увидел, в Mercury отсечение фактически есть, только выражается не отдельным предикатом (как в обычных Прологах), а интерпретируется из синтаксиса (..;..), который следует понимать как ИСКЛЮЧАЮЩЕЕ_ИЛИ, что по сути своей и выполняет отсечение (исключение альтернатив). Или я понял не так?

<!--QuoteBegin-xonix
@
[b]Получается в VIP таки надо два отдельных предиката писать - один с !, второй - без.
Ест-но!!! Режим детерминизма зависит не только от потока аргументов, но также определяется и наличием/отсутствием отсечений. И вообще, явное описание режима детерминизма предикатов в VIP7 - способ компилятора возвысится над программистом Я сам не всегда правильно пишу режим, так как особо не парюсь над этим, если что - компилятор поправит. По большому счёту можно было бы обойтись и без объявления режимов, т.к. компилятор сам определяет правильный режим детерминизма на основании клозов предиката и глобального потока(ов) аргументов.

<!--QuoteBegin-xonix

[b]На самом деле оба mercury варианта абсолютно идентичны,
В Mercury может и идентичны, а в VIP есть разница. Вот пример:
Код:
class predicates
member1 : (E,E*) nondeterm (i,i).
member2 : (E,E*) nondeterm (i,i) (o,i).
    
clauses
member1(X,[X|_]):-!.
member1(X,[_|L]):-member1(X,L).

member2(X,[X|_]).
member2(X,[_|L]):-member2(X,L).

run():-init(),
    (member1(6,[2,3,7,7]),write("Угу "),fail;write("...")),nl,
    (member1(7,[2,3,7,7]),write("Угу "),fail;write("...")),nl,
    (member2(6,[2,3,7,7]),write("Угу "),fail;write("...")),nl,
    (member2(7,[2,3,7,7]),write("Угу "),fail;write("...")),nl,
    (member2(X,[2,3,7,7]),write(X),fail;write("...")).
Вот результат:
Цитата:
...
Угу ...
...
Угу Угу ...
2377...
При откате назад member1 выдаёт только одно решение или не одного.
В такой же ситуации member2 ведёт себя иначе - выдаёт все возможные решения, или не одного (если таковых нет).
Как видим, и декларативная и операционная семантика этих предикатов различны. Кроме того, в VIP эти предикаты имеют только один режим - nondeterm.
xonix, представьте пожалуйста результаты работы mercury на программе из Вашего сообщения №14, но по тестам из моей проги в этом сообщении.
Ответить с цитированием
  (#18 (permalink)) Старый
Alison Alison вне форума
Member
 
Сообщений: 4,781
Сказал(а) спасибо: 0
Поблагодарили 119 раз(а) в 116 сообщениях
Регистрация: 17.11.2004
По умолчанию 28.04.2010, 19:10

Цитата:
<div class='quotetop'>Цитата
Цитата:
Получается в VIP таки надо два отдельных предиката писать - один с !, второй - без.
Ест-но!!![/quote]
Естественно, можно и один. Да только не нужно.
Ответить с цитированием
  (#19 (permalink)) Старый
xonix xonix вне форума
Member
 
Сообщений: 429
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 16.03.2007
По умолчанию 28.04.2010, 19:33

Цитата:
Мне кажется, что это не так. Ибо:
Вот здесь ошибка: semidet не есть determ в VIP.
А, по-моему, именно то. В mercury semidet это 0 или 1 решение.
В VIP - то же самое - determ. См.

http://wiki.visual-prolog.com/index.php?ti...ference/Domains

Цитата:
erroneous = {}
failure = {Fail}
procedure = {Succeed}
determ = {Fail, Succeed}
multi = {Succeed, BacktrackPoint}
nondeterm = {Fail, Succeed, BacktrackPoint}
Цитата:
Как я увидел, в Mercury отсечение фактически есть, только выражается не отдельным предикатом (как в обычных Прологах), а интерпретируется из синтаксиса (..;..), который следует понимать как ИСКЛЮЧАЮЩЕЕ_ИЛИ, что по сути своей и выполняет отсечение (исключение альтернатив). Или я понял не так?
Думаю, не так. Прикол mercury именно в том, что ";" обрабатывается компилятором как исключающее или не исключающее в зависимости от декларации детерминизма предиката. И даже более того, декларацию можно опустить. Тогда она выведется из использования. Если в одном месте предикат будет исползоваться как (in, in) semidet а в другом (out, in) nondet - то компилятор и выведет эти два варианта декларации самостоятельно, используя вывод типов компилятором по RTTI

http://en.wikipedia.org/wiki/Run-time_type_information
http://www.springerlink.com/content/h4545r8r87566186/

Цитата:
xonix, представьте пожалуйста результаты работы mercury на программе из Вашего сообщения №14, но по тестам из моей проги в этом сообщении.
Приведу, только чуток попозже. Только замечу, что в mercury fail-driven loops невозможны, только рекурсия. Если интересно, объясню почему и, главное, какая от этого польза.
Ответить с цитированием
  (#20 (permalink)) Старый
Винитарх Винитарх вне форума
Специалист
 
Аватар для Винитарх
 
Сообщений: 7,956
Сказал(а) спасибо: 2
Поблагодарили 303 раз(а) в 303 сообщениях
Регистрация: 01.03.2003
Адрес: Краснодар
По умолчанию 28.04.2010, 19:39

Цитата:
Originally posted by xonix+-->
Цитата:
Только замечу, что в mercury fail-driven loops невозможны, только рекурсия.
ОХРЕНЕТЬ! А что же такое в mercury режим nondeterm?
<!--QuoteBegin-xonix

[b]обрабатывается компилятором как исключающее или не исключающее в зависимости от декларации
Значит всё-же отсечение есть!
Ответить с цитированием
Ads.
  (#21 (permalink)) Старый
xonix xonix вне форума
Member
 
Сообщений: 429
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 16.03.2007
По умолчанию 28.04.2010, 20:06

Цитата:
ОХРЕНЕТЬ! А что же такое в mercury режим nondeterm?
В mercury:

Код:
                     Maximum number of solutions
     Can fail?       0               1               > 1
     no              erroneous       det             multi
     yes             failure         semidet         nondet

Цитата:
Значит всё-же отсечение есть! :-)
Зачем ставить отсечения во главу угла? Отсечения - это лишь средство достижения цели (эффективности). Куда более логичным выглядит постановка во главу угла именно декларирование детерминизма предиката. Я о том, что mercury берет на себя работу генерирования оптимального кода в зависимости от декларации mode для предиката, а в VIP эта работа возлагается на программиста путём необходимости правильного распихивания "!".
Ответить с цитированием
  (#22 (permalink)) Старый
Винитарх Винитарх вне форума
Специалист
 
Аватар для Винитарх
 
Сообщений: 7,956
Сказал(а) спасибо: 2
Поблагодарили 303 раз(а) в 303 сообщениях
Регистрация: 01.03.2003
Адрес: Краснодар
По умолчанию 29.04.2010, 00:29

Цитата:
Originally posted by xonix
[b]Can fail?
Ещё раз уточните - есть ли в mercury откат? Вы же ранее писали, что "...в mercury fail-driven loops невозможны..." :tmb: Вот я и подумал, что откатов нет.
Цитата:
Originally posted by xonix
[b]Зачем ставить отсечения во главу угла? Отсечения - это лишь средство достижения цели (эффективности).
Этот вопрос конечно не принципиальный. Однако для себя я хочу выяснить - Вы в первой теме писали, что отсечений нет поэтому мол и код быстрый, а я увидел что отсечения есть, только записываются по другому.

Ну и хотелось конечно посмотреть как Вша прога проходит мой тест (если всё же откаты есть).
Ответить с цитированием
  (#23 (permalink)) Старый
xonix xonix вне форума
Member
 
Сообщений: 429
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 16.03.2007
По умолчанию 29.04.2010, 02:21

Цитата:
Ещё раз уточните - есть ли в mercury откат? Вы же ранее писали, что "...в mercury fail-driven loops невозможны..." :tmb: Вот я и подумал, что откатов нет.
failure-driven loops невозможны, да, но не из-за отсутствия отсечений, а потому, что в mercury все предикаты (кроме ввода-вывода) - чистые в математическом смысле. А значит, компилятор может их тасовать как хочет. Т.е.

goal, fail эквивалентно fail, goal и приехали.

На самом деле компилятор так и делает, тасует порядок предикатов как ему заблагорассудится во имя достижения наиэффективнейшего кода.
Подробнее тут:

http://www.mercury.csse.unimelb.edu.au/inf.../FailLoops.html

Пример. Mercury легко прохавает код:

Код:
main --> { X=Y, Z=Y, Z=Q, 123=Q }, print(X).
потому что он переставит все унификации таким образом, чтоб всё было хорошо. А именно

Код:
Q=123, Z=Q, Y=Z, X=Y
(VIP так не умеет, классические прологи - умеют)

А как же быть с вводом-выводом, спросите Вы? Ведь если компилятор будет тасовать ввод-вывод как карта ляжет, так получится же полная фигня? :upset:

Однако, нифига подобного! Дело в том, что все "грязные" предикаты, включая ввод-вывод всегда имеют два дополнительных параметра с модами in, out где первый - это входящее состояние "мира" а out - выходящее (ну очень похоже на Haskell в чем-то).

Т.е. то что в обычном прологе выглядит
Код:
main :- print("Hello"),nl,print("world!").
в mercury звучит:

Код:
main(In, Out) :- print("Hello",In,In1),nl(In1,In2),print("world!",In2,Out).
Или сокращенно (используя синтаксис State-переменных)

Код:
main(!IO) :- print("Hello",!IO),nl(!IO),print("world!",!IO).
или (используя DCG-нотацию, да, mercury поддерживает её как и SWI) можно передавать эти параметры неявно

Код:
main --> print("Hello"),nl,print("world!").
Таким образом, для грязных предикатов при помощи "мировых" переменных задаётся функциональная зависимость, и компилятор уже не смеет их переставлять, т.к. результат следующего зависит от предыдущего. Это, кстати, один из ответов на Ваш вопрос, чем обусловлено преимущество mercury в скорости. Он, просто, имеет больше путей оптимизировать код.
Ответить с цитированием
  (#24 (permalink)) Старый
D_K D_K вне форума
Member
 
Сообщений: 1,681
Сказал(а) спасибо: 0
Поблагодарили 1 раз в 1 сообщении
Регистрация: 23.11.2005
По умолчанию 29.04.2010, 03:51

xonix, большое спасибо за интересные сообщения. Все-таки точно потрогаю Mercury, как только будет чуть больше времени.
Кстати, может вы уже и упоминали, да я пропустил, но как дела с интеграцией с С/С++?
Цитата:
<div class='quotetop'>Цитата(xonix @ 27.4.2010, 0:14) <{POST_SNAPBACK}>
Цитата:
Хотя дебагер есть, но консольный. IDE нету.

[/quote]
Не вижу ничего плохого в консольном дебагере(какие задачи дебагера требуют наличия GUI?).
IDE тоже является лишь удобным(кому как, правда) дополнением.
Ответить с цитированием
Ads
  (#25 (permalink)) Старый
SergeMukhin SergeMukhin вне форума
Member
 
Сообщений: 260
Сказал(а) спасибо: 0
Поблагодарили 1 раз в 1 сообщении
Регистрация: 22.06.2006
По умолчанию 29.04.2010, 11:53

Цитата:
Не вижу ничего плохого в консольном дебагере(какие задачи дебагера требуют наличия GUI?).
IDE тоже является лишь удобным(кому как, правда) дополнением.
Плохого в консольном нет ничего . Плохо отсутствие GUI Отладчика.

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

Ответить с цитированием
  (#26 (permalink)) Старый
AD AD вне форума
Member
 
Сообщений: 575
Сказал(а) спасибо: 7
Поблагодарили 3 раз(а) в 3 сообщениях
Регистрация: 15.07.2009
По умолчанию 29.04.2010, 13:05

Цитата:
Наверно, все можно сделать консольным отладчиком (если он полный), но наличие GUI дебаггера, на порядок (если не на два) ускоряет работу по отладке программ.
Ну попробуйте, посмотреть по стеку предикаты, и где-нибудь в середине стека и переменные, а переменная - список из сложных термов. На консольном отладчике это будет час работы. На GUI - 10 sec
Не могу не согласиться с этим, т.е. солидарен полностью! Столкнулся с gdb-отлатчиком. Гм-кхм.... не сравнить с отладчиком в студии. Разница налицо. Пусть не смущает, что языки - разные. Цель отладчиков и работа в нем одинаковая.
Ответить с цитированием
  (#27 (permalink)) Старый
D_K D_K вне форума
Member
 
Сообщений: 1,681
Сказал(а) спасибо: 0
Поблагодарили 1 раз в 1 сообщении
Регистрация: 23.11.2005
По умолчанию 29.04.2010, 16:05

Цитата:
Столкнулся с gdb-отлатчиком. Гм-кхм.... не сравнить с отладчиком в студии. Разница налицо.
Ага, gdb побогаче будет. Он просто требует навыков работы, как и все мощные инструменты. Ты еще пасмотри на свежий, ненастроенный Emacs или Vim и сравни их с редактором студии.
Сначала будет казаться, что студия удобнее, а вот через пару недель-месяц работы, все будет наоборот.
Кстати, у Emacs'а есть удобная интеграция с gdb.
Ладно, это отдельный холивар. Я просто хотел сказать, что понятие удобства относительно и зависит от человека. И еще, консоль в windows и консоль в unix-like системах - это очень разные консоли .
Ответить с цитированием
  (#28 (permalink)) Старый
Винитарх Винитарх вне форума
Специалист
 
Аватар для Винитарх
 
Сообщений: 7,956
Сказал(а) спасибо: 2
Поблагодарили 303 раз(а) в 303 сообщениях
Регистрация: 01.03.2003
Адрес: Краснодар
По умолчанию 30.04.2010, 08:38

Цитата:
Originally posted by xonix+-->
Цитата:
failure-driven loops невозможны, да, но не из-за отсутствия отсечений, а потому, что ............
Отсечения и циклы, управляемые откатом никак не связаны между собой.
Из Ваших сообщений я делаю вывод, что mercury не имеет механизма бэктрекинга, но имеет отсечения, которые синтаксически выражаются иначе, чем в Прологах.
Следовательно какие бы то ни было сопоставления режимов детерминизма между mercury и VIP7 неправомочны.

<!--QuoteBegin-xonix

[b]Can fail? 0 1 > 1
no erroneous det multi
yes failure semidet nondet
Второй раз прошу: Объясните в каком случае будет multi и nondet если откатов в mercury нет?
Ответить с цитированием
  (#29 (permalink)) Старый
xonix xonix вне форума
Member
 
Сообщений: 429
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 16.03.2007
По умолчанию 12.05.2010, 23:01

Цитата:
Отсечения и циклы, управляемые откатом никак не связаны между собой.
Из Ваших сообщений я делаю вывод, что mercury не имеет механизма бэктрекинга, но имеет отсечения, которые синтаксически выражаются иначе, чем в Прологах.
Следовательно какие бы то ни было сопоставления режимов детерминизма между mercury и VIP7 неправомочны.
Бэктрекинг есть (см. пример ниже). Отсечений нету, семантика определяется кодом и декларацией modes + детерминизма.

Цитата:
Второй раз прошу: Объясните в каком случае будет multi и nondet если откатов в mercury нет?
См. пример, тут есть оба варианта:

Код:
:- module v.

:- interface.

:- import_module io.

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

:- implementation.


:- import_module int, list, solutions.

:- pred positive(int::in, int::out) is nondet.
positive(N, R) :- N > 0, (R=1; R=2).

:- pred select(T::out, list(T)::in, list(T)::out) is nondet. 
select(A, [A | B], B).
select(A, [_ | B], B1) :- select(A, B, B1).

:- pred all_pairs_giving(int::in, list(int)::in, {int,int}::out) is nondet.
all_pairs_giving(N, L, {A, B}) :-
    select(A, L, L1),
    select(B, L1, _),
    A =< B,  % if not succeed -> backtrack
    A + B = N. % if not succeed -> backtrack

:- pred next_5_nums(int::in, int::out) is multi.
next_5_nums(N, R) :-
    ( R = N+1
    ; R = N+2
    ; R = N+3
    ; R = N+4
    ; R = N+5
    ).

main -->
    % prints 1 2
    unsorted_aggregate(positive(5),(pred(N::in, di, uo) is det -->
                   print(N),nl)),

    % prints nothing
    unsorted_aggregate(positive(-7),(pred(N::in, di, uo) is det -->
                   print(N),nl)),

    /* prints
       {0, 10}
       {1, 9}
       {2, 8}
       {3, 7}
       {4, 6}
       */
    unsorted_aggregate(all_pairs_giving(10, [0,1,2,3,4,5,6,7,8,9,10]),
          (pred(N::in, di, uo) is det -->
           print(N),nl)),

    /* prints
       11
       12
       13
       14
       15
       */
    unsorted_aggregate(next_5_nums(10),
               (pred(N::in, di, uo) is det -->
                print(N),nl))
    .
Ответить с цитированием
  (#30 (permalink)) Старый
Винитарх Винитарх вне форума
Специалист
 
Аватар для Винитарх
 
Сообщений: 7,956
Сказал(а) спасибо: 2
Поблагодарили 303 раз(а) в 303 сообщениях
Регистрация: 01.03.2003
Адрес: Краснодар
По умолчанию 14.05.2010, 00:33

Цитата:
Originally posted by xonix+-->
Цитата:
Пример. Mercury легко прохавает код:
Код Prolog
main --> { X=Y, Z=Y, Z=Q, 123=Q }, print(X).
VIP5.x и старше так тоже умеют.
Цитата:
Originally posted by xonix@
[b]Отсечений нету
Мы же здесь уже выяснили, что есть ИСКЛЮЧАЮЩЕЕ_ИЛИ. А это и есть отсечение.
<!--QuoteBegin-xonix

[b]См. пример, тут есть оба варианта:
Пример не в тему. Так как надо сравнить один предикат с разными режимами детерминизма. Я в этой ветке Вас просил написать простенькую прогу, чтоб сравнить режим детерминизма:
Код:
class predicates
member1 : (E,E*) nondeterm (i,i).
member2 : (E,E*) nondeterm (i,i) (o,i).
    
clauses
member1(X,[X|_]):-!.
member1(X,[_|L]):-member1(X,L).

member2(X,[X|_]).
member2(X,[_|L]):-member2(X,L).

run():-init(),
    (member1(6,[2,3,7,7]),write("Угу "),fail;write("...")),nl,
    (member1(7,[2,3,7,7]),write("Угу "),fail;write("...")),nl,
    (member2(6,[2,3,7,7]),write("Угу "),fail;write("...")),nl,
    (member2(7,[2,3,7,7]),write("Угу "),fail;write("...")),nl,
    (member2(X,[2,3,7,7]),write(X),fail;write("...")).
Жду до сих пор.

xonix, представьте пожалуйста результаты работы mercury на программе из Вашего сообщения №14, но по тестам из моей проги в этом сообщении.
Ответить с цитированием
Ответ

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

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

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 - компьютерный форум и программирование, форум программистов