Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Языки программирования > Prolog
Перезагрузить страницу Исследуем язык программирования Mercury
Ответ
 
Опции темы Опции просмотра
  (#76 (permalink)) Старый
Винитарх Винитарх вне форума
Специалист
 
Аватар для Винитарх
 
Сообщений: 7,961
Сказал(а) спасибо: 2
Поблагодарили 303 раз(а) в 303 сообщениях
Регистрация: 01.03.2003
Адрес: Краснодар
По умолчанию 05.10.2016, 22:21

Вы пробуете на вкус разные языки. А для "уязвления" надо бы знать какой-нибудь один, но глубоко. И хорошо бы знать алгоритмы. Иначе, Ваши преобразования типа "IIII -> IV" не способствуют "уязвлению"
Ответить с цитированием
  (#77 (permalink)) Старый
SergeMukhin78 SergeMukhin78 вне форума
Member
 
Сообщений: 563
Сказал(а) спасибо: 17
Поблагодарили 35 раз(а) в 35 сообщениях
Регистрация: 28.03.2012
По умолчанию 06.10.2016, 01:05

кстати, вот такая ф-ия есть в google sheets:
Цитата:
РИМСКОЕ (ROMAN)
Записывает указанное число с помощью римских цифр.

Пример использования
РИМСКОЕ(499; 0)

РИМСКОЕ(A2)

Синтаксис
РИМСКОЕ(число; [упрощение])

число – число, записанное арабскими цифрами. Принимаются числа от 1 до 3999 включительно.

упрощение – [ НЕОБЯЗАТЕЛЬНО – 0 по умолчанию ] – степень, до которой могут смягчаться традиционные синтаксические правила, от 0 до 4 включительно.

0 указывает, что требуется строгое соответствие правилам. Так, I может находиться только перед V и X, V может находиться только перед X, X может находиться только перед L и C, L может находиться только перед C, и C может находиться только перед D и M. Таким образом, РИМСКОЕ(499; 0) = CDXCIX.

1 указывает, что правила смягчены. То есть, V может находиться перед L и C, а L может находиться перед D и M. Тогда РИМСКОЕ(499; 1) = LDVLIV.

2 указывает на ещё большее смягчение правил. Теперь I может находиться перед L и C, а X может находиться перед D и M. Таким образом, РИМСКОЕ(499; 2) = XDIX.

3 указывает на очередное смягчение правил. Теперь V может находиться перед D и M. Таким образом, РИМСКОЕ(499; 3) = VDIV.

4 указывает на окончательное смягчение правил. Теперь I может находиться перед D и M. Таким образом, РИМСКОЕ(499; 4) = ID.
Ответить с цитированием
  (#78 (permalink)) Старый
ayax ayax вне форума
Member
 
Сообщений: 63
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 18.08.2016
По умолчанию 06.10.2016, 21:38

Подумал над тем, что написал и понял что "не та степь". Переделал:
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.split_list( int, list.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)
     ).
Компилятор пишет следующее:
bash Код:
007: In definition of function 'a_r.arab_rim'/3
        error: undef type 'list.split_list'/2
По прежнему надо знать как превратить число в список цифр, а так же как осуществить вывод этого списка.
Ответить с цитированием
  (#79 (permalink)) Старый
ayax ayax вне форума
Member
 
Сообщений: 63
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 18.08.2016
По умолчанию 06.10.2016, 21:50

ups... конечно undefined
Ответить с цитированием
  (#80 (permalink)) Старый
ayax ayax вне форума
Member
 
Сообщений: 63
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 18.08.2016
По умолчанию 25.10.2016, 04:02

Вот что то вроде "заготовки" для перевода из Arab в Rim:
prolog Код:
:- module a_r.
:- interface.
:- import_module io.
:- pred main(io::di, io::uo) is det.
:- implementation.
:- import_module int, list, char, string.
   main(!IO):-
     io.format("Vvedite Arab = ", [], !IO),
     io.read_line_as_string(Result, !IO),
     ( if Result = ok(String),
          string.to_int(string.strip(String), Arab),
          string.int_to_string(Arab, R),
          Q = string.words(R),
          list.reverse(Q, T),  
          E = string.append_list(T)
     then io.format("Arab(%d) ===> Rim(%s)\n", [i(Arab), s(E)], !IO),
          main(!IO)
     else io.format("I dind't expect that...\n", [], !IO),
          main(!IO)
     ).
Строка 'Q = string.words(R)' не работает (string.words ),
и это при том что:
Запомните! По непонятным причинам, будет Очень Плохой Идеей включать в строки нулевой символ \x00\.
т.е. - превращение строки в список и обратно с помощью split и join не
возможно, т.к. \х00\ == ""
Проблему ("") для "обратно" я решил - E = string.append_list(T)
Проблему "туда" - нет.
Конечно её можно решить с помощью деления на "голову" и "хвост",
но я хочу по полной воспользоваться F возможностями Mercury,
так что пока -
Ответить с цитированием
Ads.
  (#81 (permalink)) Старый
ayax ayax вне форума
Member
 
Сообщений: 63
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 18.08.2016
По умолчанию 25.10.2016, 12:11

Бессонница дело такое
Добавлю про Q = string.words(R),
отладчик не находит ошибок, компиляция проходит успешно,
но - Arab(123) ===> Rim(123). Пошаговая проверка программы
показывает что в строке Q = ... ни чего не происходит, т.е.
реверсировать нечего...
Ответить с цитированием
  (#82 (permalink)) Старый
ayax ayax вне форума
Member
 
Сообщений: 63
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 18.08.2016
По умолчанию 25.10.2016, 13:05

И конечно её можно решить с помощью деления на "голову" и "хвост",
не получится т.к. R - строка!
Ответить с цитированием
  (#83 (permalink)) Старый
Feofilakt Feofilakt вне форума
Member
 
Сообщений: 75
Сказал(а) спасибо: 7
Поблагодарили 1 раз в 1 сообщении
Регистрация: 23.02.2012
Адрес: Иркутск
По умолчанию 28.10.2016, 18:10

Цитата:
Сообщение от ayax Посмотреть сообщение
Просто меня в данный момент больше интересует как сделать arab_rim на основе списка [I, V, X, L, C, D, M] на декларативном языке
Возможно, вам будет интересна моя программа https://github.com/Feofilakt/RomanNu...ter/SWI-Prolog
Ответить с цитированием
  (#84 (permalink)) Старый
Винитарх Винитарх вне форума
Специалист
 
Аватар для Винитарх
 
Сообщений: 7,961
Сказал(а) спасибо: 2
Поблагодарили 303 раз(а) в 303 сообщениях
Регистрация: 01.03.2003
Адрес: Краснодар
По умолчанию 28.10.2016, 18:26

Цитата:
Сообщение от Feofilakt Посмотреть сообщение
Возможно, вам будет интересна моя программа https://github.com/Feofilakt/RomanNu...ter/SWI-Prolog
Возможно Вам будет интересна моя программа , тоже на SWI: Io - язык программирования Причём она гоняет числа и туда и обратно
Ответить с цитированием
Ads
  (#85 (permalink)) Старый
Feofilakt Feofilakt вне форума
Member
 
Сообщений: 75
Сказал(а) спасибо: 7
Поблагодарили 1 раз в 1 сообщении
Регистрация: 23.02.2012
Адрес: Иркутск
По умолчанию 30.10.2016, 14:24

Цитата:
Сообщение от Винитарх Посмотреть сообщение
Возможно Вам будет интересна моя программа , тоже на SWI: Io - язык программирования Причём она гоняет числа и туда и обратно
У меня тоже и туда, и обратно, и оба туда (проверка), и даже оба обратно (генерация)
А у вас допускаются и некорректные конструкции, например "VIV"
Ответить с цитированием
  (#86 (permalink)) Старый
Винитарх Винитарх вне форума
Специалист
 
Аватар для Винитарх
 
Сообщений: 7,961
Сказал(а) спасибо: 2
Поблагодарили 303 раз(а) в 303 сообщениях
Регистрация: 01.03.2003
Адрес: Краснодар
По умолчанию 30.10.2016, 16:56

ЗдОрово!
Для добавления генерации и обеспечения корректности чисел в моей проге:
1) Если арабские не складывать, а конкатенировать, то можно уложиться в прежний размер исходника.
2) Или можно работать чисто со списками символов как для римских, так и для арабских.
Сейчас навскидку и не скажу, какой вариант в SWI будет короче.
Ответить с цитированием
  (#87 (permalink)) Старый
ayax ayax вне форума
Member
 
Сообщений: 63
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 18.08.2016
По умолчанию 04.11.2016, 20:56

Конкретный вопрос: есть список символов, надо превратить его в список строк(точнее в список строк состоящих из одной буквы - 'T' --> "T")
Пока наваял следующее:
prolog Код:
R = list.map(string.char_to_string(T))
или
prolog Код:
list.map(string.char_to_string(T), R)
Что здесь не так, и как написать правильно.
Если есть возможность, напишите об обеих строчках кода.
Ответить с цитированием
  (#88 (permalink)) Старый
ayax ayax вне форума
Member
 
Сообщений: 63
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 18.08.2016
По умолчанию 05.11.2016, 03:06

Решение для 1-ой строки:
prolog Код:
R = list.map(string.char_to_string, T)
Ответить с цитированием
  (#89 (permalink)) Старый
ayax ayax вне форума
Member
 
Сообщений: 63
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 18.08.2016
По умолчанию 05.11.2016, 04:17

Другая версия "заготовки:
prolog Код:
:- module a_r_2.
:- interface.
:- import_module io.
:- pred main(io::di, io::uo) is det.
:- implementation.
:- import_module int, char, string, list.
   main(!IO):-
     io.format("Vvedite Arab = ", [], !IO),
     io.read_line_as_string(Result, !IO),
     ( if Result = ok(String),
          string.to_char_list(string.strip(String), Q),
          list.reverse(Q, T),
          R = list.map(string.char_to_string, T),
          %list.map(string.char_to_string, T, R),
          E = string.append_list(R),
          string.to_int(string.strip(String), U)
     then io.format("Arab(%d) ===> Rim(%s)\n", [i(U), s(E)], !IO),
          main(!IO)
     else io.format("I dind't expect that...\n", [], !IO),
          main(!IO)
     ).
Ответить с цитированием
  (#90 (permalink)) Старый
Исмаил Прокопенко Исмаил Прокопенко вне форума
Member
 
Сообщений: 23
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 30.07.2016
По умолчанию 06.11.2016, 14:23

Решил вот освоить какой-нибудь декларативный язык.
Один "ЛИСП-образный". Другой "ПРОЛОГ-образный".
Из "ПРОЛОГ-образных" очень много "мертвых" диалектов.
А Mercury вроде достаточно свежий.
Подскажите: для каких задач он реально "рулид".
Т.е. лучше и быстрей чем на Mercury задачу не решишь
Ответить с цитированием
Ответ

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

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

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