Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Языки программирования > Prolog
Перезагрузить страницу Конвертация римских чисел в арабские (Visual Prolog 8)
Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
bars1k- bars1k- вне форума
Новичок
 
Сообщений: 1
Сказал(а) спасибо: 1
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 26.09.2018
По умолчанию Конвертация римских чисел в арабские (Visual Prolog 8) - 04.10.2018, 21:03

Пытаясь перевести числа из римских в арабские, столкнулся с тем, что компилятор матюкается на предикат следующим образом:
e603 The flow pattern '(i,i)' does not exist for 'main::rom_ar/2'
s603 The flow pattern '(i,i)' does not exist for 'main::rom_ar/2'

Ниже привожу код:
prolog Код:
implement main
    open core, console, string
class facts
    replace: (string, integer).
class predicates
    rom_ar:(string, integer [out]) nondeterm.

clauses
    rom_ar("", _):- !.
    rom_ar(Roman, Accum):- front(Roman, 1, Head, Tail), replace(Head, A), rom_ar(Tail, Accum+A).

    replace("M", 1000).
    replace("CM", 900).
    replace("D", 500).
    replace("CD", 400).
    replace("C", 100).
    replace("XC", 90).
    replace("L", 50).
    replace("XL", 40).
    replace("X", 10).
    replace("IX", 9).
    replace("V", 5).
    replace("IV", 4).
    replace("I", 1).

    run() :-
        (rom_ar("MMXIII", Ar), write(Ar)
        orelse
        write("Failed!")),
        _ = readline().

end implement main

goal
    console::run(main::run).

Где была допущена столь фатальная оплошность?
Ответить с цитированием
  (#2 (permalink)) Старый
VictorY VictorY вне форума
Member
 
Аватар для VictorY
 
Сообщений: 991
Сказал(а) спасибо: 0
Поблагодарили 44 раз(а) в 44 сообщениях
Регистрация: 10.02.2005
По умолчанию 04.10.2018, 22:07

Visual Prolog Код:
class predicates
    rom_ar:(string, integer [out]) nondeterm.

У Вас второй параметр объявлен выходным, а Вы в него передаете текущее значение аккумулятора ( то есть используете как входной).
Если его объявить как
rom_ar:(string, integer)->integer Result nondeterm.
То завершение процесса будет выглядеть как
rom_ar("", Result_)=Result:- !.

Остальные детали доработайте сами.
Ответить с цитированием
Пользователь сказал cпасибо:
bars1k- (04.10.2018)
  (#3 (permalink)) Старый
SergeMukhin78 SergeMukhin78 вне форума
Member
 
Сообщений: 563
Сказал(а) спасибо: 17
Поблагодарили 35 раз(а) в 35 сообщениях
Регистрация: 28.03.2012
По умолчанию 05.10.2018, 10:01

в front отрезается по одной букве, а в базе есть двухбуквенные факты

ps

мне кажется, что эта задача уже решалась на форуме
Ответить с цитированием
  (#4 (permalink)) Старый
Винитарх Винитарх вне форума
Специалист
 
Аватар для Винитарх
 
Сообщений: 7,961
Сказал(а) спасибо: 2
Поблагодарили 303 раз(а) в 303 сообщениях
Регистрация: 01.03.2003
Адрес: Краснодар
По умолчанию 05.10.2018, 21:15

Не беспокойтесь, это мои студенты вчера не дождались сегодняшнего занятия
Сегодня мы разобрали решение этой задачи разными способами: и с front, и с hasPrefix.
И да, эта задача решалась на форуме.
Да и чего только здесь не решалось!

Вопрос оффтопик к ответчикам в этой теме: Я летом написал двусвязные списки на поинтерах. Эти списки используют два указателя, которые могут двигаться с разных сторон и в любом направлении вплоть до друг друга. Но не оформил красиво (в виде дженерик-класса), чтобы тиснуть на форуме visual-prolog, так как время потеряю впустую, как это уже было с цветной консолью и с классом списков годы назад.
Будет ли заинтересован PDC в таком классе для включения в PFC или нет?

И ещё - заявленную летом на форуме visual-prolog хэш-функцию я допилил. Она даёт в два раза меньше коллизий (для русского языка) по сравнению с функцией hash из класса string (тот самый алгоритм MurMur). Функция настраивается под любой язык или его подмножество. Пока её алгоритм не публикую на форуме visual-prolog, так как буду публиковать в журнале.
Ответить с цитированием
  (#5 (permalink)) Старый
SergeMukhin78 SergeMukhin78 вне форума
Member
 
Сообщений: 563
Сказал(а) спасибо: 17
Поблагодарили 35 раз(а) в 35 сообщениях
Регистрация: 28.03.2012
По умолчанию 06.10.2018, 03:54

Цитата:
Сообщение от Винитарх Посмотреть сообщение
Сегодня мы разобрали решение этой задачи разными способам
кажется, что это хорошая задача для студентов, т.к. сам формат римских чисел подразумевает несколько вариантов (римские числа есть строгие и не очень и тп).

Но представленный алгоритм (даже после исправления очевидных ошибок) будет работать не верно во многих случаях.

Например число IM - в строгом неверно, а в расширенном верно (а этот алгоритм кажется выдаст вообще 1001). Или IIIII выдаст 5, но в строгом формате это не правильное римское число.

Мне кажется, что в целях обучения тут надо разделить задачу на две.
первая - "лексический" разбор. т.е. отбор символа и его анализ,
второй - на основе полученной числовой строки вычисление.

Первая фаза это front и тп но вроде становится тривиальной.
Вторая вычисление (самое интересное).

Например число XVII
на первом этапе превращается в массив (список, и тп) 10 5 1 1
на втором этапе это вычисляется.

ps
Обязательно подсунут им в качестве теста
1. пустую строку
2. строку, которая вызовет переполнение (если это возможно), (например MMMMMMMM....) или VVVX
3. и тд и тп

pps
не могу не привести шутку.
у студента спрашивают, сколько известных исторических личностей вы знаете во Франции.
Студент: 16.
О! как много. какие?
Студент: Людовик I ... Людовик XVI

Последний раз редактировалось SergeMukhin78; 06.10.2018 в 03:55 Причина: очепятка
Ответить с цитированием
Ads.
Ads
Ответ

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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
из turbo prolog в visual prolog - где будут отличия в коде? Sasha_Sasha Prolog 6 21.12.2015 22:38
Нужно переделать программу из Turbo Prolog в Visual Prolog Hedgehok Prolog 0 09.05.2015 02:37
Нужно перевести код из Turbo Prolog в Visual Prolog 5.2 Irina1094 Prolog 8 30.11.2014 22:52
Переписать программу из SWI-Prolog в Visual Prolog enulinum Задания за деньги 1 29.05.2014 02:32
Перенос программ из {TurboProlog.....Visual Prolog 5.2} в Visual Prolog 7 imported_Jenny_ Prolog 30 25.03.2013 19:15
Нужно перевести код из Turbo Prolog в Visual Prolog GGHz Prolog 7 08.12.2012 19:46
Нужно разобрать программу для перевода списка арабских чисел в список римских чисел. RuslanTM Prolog 2 18.12.2011 17:04
Помогите переделать задачу из Turbo Prolog в Visual Prolog 5 imported_Anneta Prolog 3 23.12.2010 22:59
Кто возьмется переписать маленькую программу с Turbo Prolog на Visual Prolog 5.0 (за плату) olik567 Prolog 4 07.10.2009 17:46
перевод из римских в арабские zauwa Prolog 8 14.04.2009 17:46
Перевод римских чисел в арабские imported_W_M Prolog 11 07.10.2008 13:21
Кто возьмется переписать маленькую программу с Turbo Prolog на Visual Prolog 5.0 (за плату) Игоревна Задания за деньги 16 04.01.2008 17:20



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