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

Кому это может быть интересно.

Вышел новый релиз Mercury версии 10.04!

Качать тут: http://www.mercury.csse.unimelb.edu....d/release.html
Что нового в этом релизе: http://www.mercury.csse.unimelb.edu.au/dow...ease-10.04.html

Через несколько дней здесь должен появиться дистрибутив под винду: http://code.google.com/p/winmercury/
Ответить с цитированием
  (#62 (permalink)) Старый
SergeMukhin SergeMukhin вне форума
Member
 
Сообщений: 260
Сказал(а) спасибо: 0
Поблагодарили 1 раз в 1 сообщении
Регистрация: 22.06.2006
По умолчанию 23.07.2010, 11:25

[quote]
Кому это может быть интересно.

Вышел новый релиз Mercury версии 10.04!

интересно. спасибо
Ответить с цитированием
  (#63 (permalink)) Старый
yatagan yatagan вне форума
Новичок
 
Сообщений: 5
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 02.01.2011
По умолчанию 02.01.2011, 17:48

здравствуйте, в рамках исследования языка Mercury пытаюсь выполнить на нём примитивную задачку из Пролога, вот такую:

parent(father,sun).

?- parent(father, X).
X = sun .

наваял я вот такое:

prolog Код:
:- module test.
 
:-interface.
:-import_module io.
:-pred main(io::di,io::uo) is det.
 
:-implementation.
:-import_module string.
 
:- pred parent(string, string).
:- mode parent(in, out) is semidet.
 
 
parent("father", "sun").
 
main(!IO) :-
parent("father", X),
io.write_string(X, !IO),
io.nl(!IO).

компилятор пишет:
prolog Код:
$ mmc --make test
Making Mercury/int3s/test.int3
Making Mercury/ints/test.int
Making Mercury/cs/test.c
test.m:005: In `main'(di, uo):
test.m:005: error: determinism declaration not satisfied.
test.m:005: Declared `det'
, inferred `semidet'.
test.m:017: call to `test.parent'
(in, out) can fail.
** Error making `Mercury/cs/test.c'.
подскажите в чём проблема, ибо исследование языка для меня закончится не начавшись, спасибо.
Ответить с цитированием
  (#64 (permalink)) Старый
Винитарх Винитарх вне форума
Специалист
 
Аватар для Винитарх
 
Сообщений: 7,963
Сказал(а) спасибо: 2
Поблагодарили 303 раз(а) в 303 сообщениях
Регистрация: 01.03.2003
Адрес: Краснодар
По умолчанию 02.01.2011, 21:04

Насколько я могу судить, предикат main у Вас объявлен как детерминированный, а определяется через полудетерминированный предикат parent.
Ответить с цитированием
  (#65 (permalink)) Старый
yatagan yatagan вне форума
Новичок
 
Сообщений: 5
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 02.01.2011
По умолчанию 03.01.2011, 13:18

я перепробывал все возможные комбинации режимов предикатов main и parent - det, semidet, multi, cc_multi - во всех случаях вывод компилятора похожий. может быть вызов parent("father", X), нужно делать как-то по особенному?
Ответить с цитированием
Ads.
  (#66 (permalink)) Старый
Винитарх Винитарх вне форума
Специалист
 
Аватар для Винитарх
 
Сообщений: 7,963
Сказал(а) спасибо: 2
Поблагодарили 303 раз(а) в 303 сообщениях
Регистрация: 01.03.2003
Адрес: Краснодар
По умолчанию 03.01.2011, 22:10

Я не знаю особенностей Mercury, но я бы попробовал такой вариант:

main(!IO) :-
parent("father", X),io.write_string(X, !IO),io.nl(!IO),!;
io.write_string("no solutions", !IO),io.nl(!IO).

Красным выделил отсечение, однако не уверен, что отсечения в Mercury обозначаются именно так (и есть ли они в нём тоже не помню).
Ответить с цитированием
  (#67 (permalink)) Старый
calabi-yau calabi-yau вне форума
Member
 
Сообщений: 338
Сказал(а) спасибо: 0
Поблагодарили 10 раз(а) в 10 сообщениях
Регистрация: 28.09.2009
По умолчанию 04.01.2011, 02:43

Цитата:
подскажите в чём проблема, ибо исследование языка для меня закончится не начавшись, спасибо.
если не изменяет память:
prolog Код:
run(!IO) :- parent("father", X) -> print(X, !IO); print("none", !IO).
или
prolog Код:
run --> {parent("father", X)} -> print(X); print("none").


Don't fear the Monad
Ответить с цитированием
  (#68 (permalink)) Старый
xonix xonix вне форума
Member
 
Сообщений: 429
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 16.03.2007
По умолчанию 04.01.2011, 03:13

В mercury это не так прозрачно, как в VIP. Тут важно понять пару вещей в контексте mercury. 1) Операции ввода-вывода в mercury могут находиться только в контексте det или cc_multi. 2) В контексте det могут находится только det выражения (контроль детерминизма), по этому любой другой более свободный детерминизм типа nondet/semidet надо тем или иным методом приводить к det. В контексте поиска решений для этого служит модуль solutions. Вот ваш пример.

prolog Код:
:- module test.
 
:-interface.
:-import_module io.
:-pred main(io::di,io::uo) is det.
 
:-implementation.
:-import_module string, solutions.
 
:- pred parent(string, string).
:- mode parent(in, out) is nondet.
 
 
parent("father", "son").
parent("father", "son1").
 
main(!IO) :-
solutions(parent("father"), L),
io.print("sons of a father: ",!IO),
io.write(L, !IO),
io.nl(!IO).

prolog Код:
C:\TEST\mercury>test
sons of a father: ["son", "son1"]
Ответить с цитированием
  (#69 (permalink)) Старый
yatagan yatagan вне форума
Новичок
 
Сообщений: 5
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 02.01.2011
По умолчанию 04.01.2011, 12:37

Цитата:
Сообщение от xonix Посмотреть сообщение
В контексте поиска решений для этого служит модуль solutions. Вот ваш пример.
Огромнейшее спасибо!

с Вашего позволения еще один вопрос:

prolog Код:
:- mode parent(in, out) is nondet.
этот фрагмент компилируется только с nondet, хотя решений тут больше или равно единице и по идее оно должно наботать и с semidet, правильно? но оно пишет:

bash Код:
$ mmc --make test
Making Mercury/cs/test.c
test.m:011: In `parent'(in, out):
test.m:011:   error: determinism declaration not satisfied.
test.m:011:   Declared `semidet'
, inferred `nondet'.
test.m:014:   Disjunction has multiple clauses with solutions.
test.m:019: In clause for `main(di, uo)'
:
test.m:019:   in call to predicate `solutions.solutions'/2:
test.m:019:   mode error: arguments `TypeCtorInfo_13, V_8, X'
have the
test.m:019:   following insts:
test.m:019:     bound(<type_ctor_info for .string/0>),
test.m:019:     /* unique */(pred((free >> ground)) is semidet),
test.m:019:     free
test.m:019:   which does not match any of the modes for predicate
test.m:019:   `solutions.solutions'/2.
For more information, recompile with `-E'
.
** Error making `Mercury/cs/test.c'.
Ответить с цитированием
  (#70 (permalink)) Старый
yatagan yatagan вне форума
Новичок
 
Сообщений: 5
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 02.01.2011
По умолчанию 04.01.2011, 14:28

да, и еще в догонку:

пытаюсь сделать обратный запрос:

parent(father,sun).

?- parent(X, sun).
X = father .

пишу:

prolog Код:
:- module test.

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

:- implementation.
:- import_module string, solutions.

:- pred parent(string, string).
:- mode parent(out, in) is nondet.

parent("father", "son").

main(!IO) :-
    solutions(parent("son"), X),
    io.write(X, !IO),
    io.nl(!IO).

получаю:

Код HTML:
$ mmc --make test && ./test 
Making Mercury/int3s/test.int3
Making Mercury/ints/test.int
Making Mercury/cs/test.c
test.m:030: In clause for `main(di, uo)':
test.m:030:   in call to predicate `solutions.solutions'/2:
test.m:030:   mode error: arguments `TypeCtorInfo_13, V_8, X' have the
test.m:030:   following insts:
test.m:030:     bound(<type_ctor_info for .string/0>),
test.m:030:     /* unique */(pred((ground >> ground)) is semidet),
test.m:030:     free
test.m:030:   which does not match any of the modes for predicate
test.m:030:   `solutions.solutions'/2.
For more information, recompile with `-E'.
** Error making `Mercury/cs/test.c'.
а так же может подскажите документацию по меркури кроме офф. сайта?
для меня там всё крайне мутно и не понятно
Ответить с цитированием
  (#71 (permalink)) Старый
xonix xonix вне форума
Member
 
Сообщений: 429
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 16.03.2007
По умолчанию 04.01.2011, 19:08

Цитата:
Сообщение от yatagan Посмотреть сообщение
с Вашего позволения еще один вопрос:

prolog Код:
:- mode parent(in, out) is nondet.
этот фрагмент компилируется только с nondet, хотя решений тут больше или равно единице и по идее оно должно наботать и с semidet, правильно?
не уверен. По логике там как раз правильнее nondet т.к. nondet = от нуля до сколько угодно решений, а semidet = 0 или 1 решение. Подробнее тут

Determinism categories - The Mercury Language Reference Manual

Что же касается вашего второго вопроса, то можно вот так:

prolog Код:
:- module test.
 
:-interface.
:-import_module io.
:-pred main(io::di,io::uo) is det.
 
:-implementation.
:-import_module string, solutions.
 
:- pred parent(string, string).
:- mode parent(in, out) is nondet.
:- mode parent(out, in) is nondet.
 
parent("father", "son").
parent("father", "son1").
parent("mother", "son").
 
main -->
    { solutions(pred(X::out) is nondet :- parent("father", X), L) },
    print("sons of a father: "),
    write(L),
    nl,

    { solutions(pred(X::out) is nondet :- parent(X, "son"), L1) },
    print("parents of son: "),
    write(L1),
    nl.

prolog Код:
C:\TEST\mercury>test
sons of a father: ["son", "son1"]
parents of son: ["father", "mother"]
Ответить с цитированием
  (#72 (permalink)) Старый
yatagan yatagan вне форума
Новичок
 
Сообщений: 5
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 02.01.2011
По умолчанию 04.01.2011, 21:22

шикарно!
всё работает!
теперь пройдемся по примерам и задачкам
Ответить с цитированием
Ads
  (#73 (permalink)) Старый
ayax ayax вне форума
Member
 
Сообщений: 63
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 18.08.2016
По умолчанию 05.10.2016, 15:10

Вот исходник:
prolog Код:
:- module a_r.
:- interface.
:- import_module io.
:- pred main(io::di, io::uo) is det.
:- implementation.
:- import_module int, list, string.
:- func arab_rim(int) = list( int).
   arab_rim( Arab) = list.split_list( "", list.list(Arab)):
   main( IO):-
     io.read_line_as_string(Result, IO),
     ( if Result = ok(String),
          string.to_int(string.strip(String), Arab)
     then io.format("arab_rim(%d) = %d\n", [i(Arab), i(arab_rim(Arab))], IO),
          main( IO)
     else io.format("I dind't expect that...\n", [], IO)
     ).
Пытаюсь сделать перевод из арабской в римскую на основе списка
[I, V, X, L, C, D, M]
Разбираюсь с самыми основами...
на данный момент компилятор ругается следующими словами:
bash Код:
In explict type qualification:
error: undefined tupe 'main'/1.
Сейчас мне надо знать как превратить число в список
(то, что я написал - правильно или нет?)
Ответить с цитированием
  (#74 (permalink)) Старый
Винитарх Винитарх вне форума
Специалист
 
Аватар для Винитарх
 
Сообщений: 7,963
Сказал(а) спасибо: 2
Поблагодарили 303 раз(а) в 303 сообщениях
Регистрация: 01.03.2003
Адрес: Краснодар
По умолчанию 05.10.2016, 15:58

Ayax, я так понимаю, что поднятую тему Io - язык программирования Вы слили?
Ответить с цитированием
  (#75 (permalink)) Старый
ayax ayax вне форума
Member
 
Сообщений: 63
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 18.08.2016
По умолчанию 05.10.2016, 17:07

Нет, уважаемый Винитарх.
Просто меня в данный момент больше интересует как сделать arab_rim на основе списка [I, V, X, L, C, D, M] на декларативном языке, что бы "уязвить" Вас...
Почему Mercury - мне интересно попробовать LogFunc язык программирования.
Ответить с цитированием
Ответ

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

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

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