Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Языки программирования > Prolog
Перезагрузить страницу Исследуем язык программирования Mercury
Ответ
 
Опции темы Опции просмотра
  (#91 (permalink)) Старый
Исмаил Прокопенко Исмаил Прокопенко вне форума
Member
 
Сообщений: 23
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 30.07.2016
По умолчанию 06.11.2016, 14:24

Например вебстраничку распарсить можно?
Т.е. есть какая-то база фактов.
И нужно после парсинга странички ее (базу) модифицировать.
+ изменить отображение веб-странички (убрать/отфильтрровать не нужную инфу, а нужную представить в более читабельном виде)
И сам парсинг вести на основе инфы в базе фактов.

Меркьюри для этого покатит?

Последний раз редактировалось Исмаил Прокопенко; 06.11.2016 в 14:27
Ответить с цитированием
  (#92 (permalink)) Старый
Исмаил Прокопенко Исмаил Прокопенко вне форума
Member
 
Сообщений: 23
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 30.07.2016
По умолчанию 09.01.2017, 00:13

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

Согласно теории, в PROLOG как и в Haskell, как и в им подобных ЯП, конструкция S = S + A[i] (где то так...) не может работать!
Т.Е. есть проблема как осуществить накопление суммы...
Я думаю о следующем - создаётся список нулевой длины и ему раз за разом присваивается значение функции
находящейся в "цикле", после его окончания получившийся список, точнее его элементы, суммируются и таким
образом мы обходим "проблему суммирования"...
Ответить с цитированием
  (#94 (permalink)) Старый
SergeMukhin78 SergeMukhin78 вне форума
Member
 
Сообщений: 563
Сказал(а) спасибо: 17
Поблагодарили 35 раз(а) в 35 сообщениях
Регистрация: 28.03.2012
По умолчанию 02.03.2017, 18:18

правильный вопрос!

1. для изменений можно использовать факты, но это не thread-safe и тп и тд, на каждого фактов не напасёшься!
2. в VIP есть специальный класс varM{A} и varM_integer
3. вот один из вариантов решения этой проблемы
prolog Код:
predicates
    length : (Elem* List) -> positive Length.
class predicates
    length2 : (Elem* Tail, positive LengthFront) -> positive Length.
clauses
    length2([], Length) = Length.

    length2([_ | Tail], LengthFront) = length2(Tail, LengthFront + 1).

clauses
    length(List) = length2(List, 0).

Последний раз редактировалось SergeMukhin78; 02.03.2017 в 18:24
Ответить с цитированием
  (#95 (permalink)) Старый
Винитарх Винитарх вне форума
Специалист
 
Аватар для Винитарх
 
Сообщений: 7,961
Сказал(а) спасибо: 2
Поблагодарили 303 раз(а) в 303 сообщениях
Регистрация: 01.03.2003
Адрес: Краснодар
По умолчанию 02.03.2017, 23:01

Цитата:
Сообщение от ayax Посмотреть сообщение
Согласно теории, в PROLOG как и в Haskell, как и в им подобных ЯП, конструкция S = S + A[i] (где то так...) не может работать!
Т.Е. есть проблема как осуществить накопление суммы...
"Согласно теории" проблемы с накоплением суммы не существует. Используйте рекурсию.
Если что не получается - приведите здесь конкретную задачу и я покажу накопление суммы.
Ответить с цитированием
Ads.
  (#96 (permalink)) Старый
Исмаил Прокопенко Исмаил Прокопенко вне форума
Member
 
Сообщений: 23
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 30.07.2016
По умолчанию 04.03.2017, 20:22

Цитата:
Сообщение от Винитарх Посмотреть сообщение
Используйте рекурсию.
Так ведь стек не бесконечен
Ответить с цитированием
Ads
  (#97 (permalink)) Старый
aag aag вне форума
ушёл... не вернётся)))
 
Сообщений: 3,400
Сказал(а) спасибо: 0
Поблагодарили 82 раз(а) в 82 сообщениях
Регистрация: 29.11.2008
По умолчанию 04.03.2017, 22:28

Цитата:
Сообщение от Исмаил Прокопенко Посмотреть сообщение
Так ведь стек не бесконечен
Разная она рекурсия.
В #94 Мухин длину списка считает.
Можно так:
Visual Prolog Код:
length([]) = 0.
length([A|B]) = 1 + length(B).
- вот оно то стек и жрёт, хоть и красивенько)))
А вот "мухиновщиной" этот самый стек не слопаешь)))
Ответить с цитированием
  (#98 (permalink)) Старый
Винитарх Винитарх вне форума
Специалист
 
Аватар для Винитарх
 
Сообщений: 7,961
Сказал(а) спасибо: 2
Поблагодарили 303 раз(а) в 303 сообщениях
Регистрация: 01.03.2003
Адрес: Краснодар
По умолчанию 05.03.2017, 01:28

Цитата:
Сообщение от Исмаил Прокопенко Посмотреть сообщение
Так ведь стек не бесконечен
Если использовать хвостовую/оптимизированную рекурсию, то стек остаётся девственно чистым.
Ответить с цитированием
  (#99 (permalink)) Старый
ayax ayax вне форума
Member
 
Сообщений: 63
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 18.08.2016
По умолчанию 28.03.2018, 20:52

Вот попытка переделки приложения (PROLOG) переводящего число из арабской системы счисления в римскую ( от Винитарх, в теме про Io - Smalltalk ...)
prolog Код:
:- module arab_rim.
:- interface.
:- import_module io.
:- pred main(io::di, io::uo) is cc_multi.
:- implementation.
:- import_module int, string.
:- pred   zamena(int::in, string::out) is semidet.
:- pred arab_rim(int::in, string::out) is semidet.
        main(!IO):-
zamena(1000, "M"). zamena(900, "CM"). zamena(500, "D"). zamena(400, "CD").
zamena(100,  "C"). zamena(90,  "XC"). zamena(50,  "L"). zamena(40,  "XL").
zamena(10,   "X"). zamena(9,   "IX"). zamena(5,   "V"). zamena(4,   "IV").
zamena(1,    "I").
arab_rim(0,  "" ).
    io.format("Vvedite Arab = ", [], !IO),
    io.read_line_as_string(Result, !IO),
    (if Result = ok(String),
    to_int(strip(String), Arab),
    arab_rim(Arab, Rim):- zamena(A1, R1), A2 = Arab - A1, A2 >= 0,
                        arab_rim(A2, R2), append(R1, R2, Rim).
then io.format("Arab(%i) ===> Rim(%s)\n", [i(Arab), s(Rim)], !IO),
        main(!IO)
else io.format("I dind't expect that...\n", [], !IO),
        main(!IO)
).
Prompt выдаёт следующее:

C:\Program Files\Mercury-11.07.1>C:\Mercury\arab_rim\arab_rim.m
C:\Mercury\arab_rim\arab_rim.m:004: Error: main/2 must be `det' or `cc_multi'.
C:\Mercury\arab_rim\arab_rim.m:004: In `main'(di, uo):
C:\Mercury\arab_rim\arab_rim.m:004: error: invalid determinism for a
C:\Mercury\arab_rim\arab_rim.m:004: predicate with I/O state arguments.
C:\Mercury\arab_rim\arab_rim.m:0020: Syntax error at token `. ': expecting `)'
C:\Mercury\arab_rim\arab_rim.m:0020: or operator.
C:\Mercury\arab_rim\arab_rim.m:021: Syntax error at token 'io': operator or `.'
C:\Mercury\arab_rim\arab_rim.m:021: expected.
For more information, recompile with `-E'.


Как исправить код что-бы он правильно работал ...
Ответить с цитированием
  (#100 (permalink)) Старый
ayax ayax вне форума
Member
 
Сообщений: 63
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 18.08.2016
По умолчанию 28.03.2018, 22:08

После более внимательного чтения распечатки
prolog Код:
:- module arab_rim.
:- interface.
:- import_module io.
:- pred main(io::di, io::uo) is cc_multi.
:- implementation.
:- import_module int, string, list.
        main(!IO):-
    io.format("Vvedite Arab = ", [], !IO),
    io.read_line_as_string(Result, !IO),
    (if Result = ok(String),
    to_int(strip(String), Arab),
    arab_rim(Arab, Rim)
then io.format("Arab(%i) ===> Rim(%s)\n", [i(Arab), s(Rim)], !IO),
        main(!IO)
else io.format("I dind`t expect that...\n", [], !IO),
        main(!IO)
).
:- pred   zamena(int::in, string::out) is semidet.
zamena(1000, "M"). zamena(900, "CM"). zamena(500, "D"). zamena(400, "CD").
zamena(100,  "C"). zamena(90,  "XC"). zamena(50,  "L"). zamena(40,  "XL").
zamena(10,   "X"). zamena(9,   "IX"). zamena(5,   "V"). zamena(4,   "IV").
zamena(1,    "I").
:- pred arab_rim(int::in, string::out) is semidet.
arab_rim(0,  "" ).
arab_rim(Arab, Rim):- zamena(A1, R1), A2 = Arab - A1, A2 >= 0,
                        arab_rim(A2, R2), append(R1, R2, Rim).
C:\Program Files\Mercury-11.07.1>C:\Mercury\arab_rim\arab_rim.m
C:\Mercury\arab_rim\arab_rim.m:025: In clause for `arab_rim(in, out)':
C:\Mercury\arab_rim\arab_rim.m:025: in argument 1 of call to predicate
C:\Mercury\arab_rim\arab_rim.m:025: `arab_rim.zamena'/2:
C:\Mercury\arab_rim\arab_rim.m:025: mode error: variable `A1' has
C:\Mercury\arab_rim\arab_rim.m:025: instantiatedness `free',
C:\Mercury\arab_rim\arab_rim.m:025: expected instantiatedness was `ground'.
For more information, recompile with `-E'.
Ответить с цитированием
  (#101 (permalink)) Старый
ayax ayax вне форума
Member
 
Сообщений: 63
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 18.08.2016
По умолчанию 29.03.2018, 20:53

А вот это работает, и работает правильно:
prolog Код:
:- module arab_rim.
:- interface.
:- import_module io.
:- pred main(io::di, io::uo) is cc_multi.
:- implementation.
:- import_module int, string, list.
        main(!IO):-
    io.format("Vvedite Arab = ", [], !IO),
    io.read_line_as_string(Result, !IO),
    (if Result = ok(String),
    to_int(strip(String), Arab),
    arab_rim(Arab, Rim)
then io.format("Arab(%i) ===> Rim(%s)\n", [i(Arab), s(Rim)], !IO),
        main(!IO)
else io.format("I dind`t expect that...\n", [], !IO),
        main(!IO)
).
:- pred   zamena(int::out, string::out) is multi.
zamena(1000, "M"). zamena(900, "CM"). zamena(500, "D"). zamena(400, "CD").
zamena(100,  "C"). zamena(90,  "XC"). zamena(50,  "L"). zamena(40,  "XL").
zamena(10,   "X"). zamena(9,   "IX"). zamena(5,   "V"). zamena(4,   "IV").
zamena(1,    "I").
:- pred arab_rim(int::in, string::out) is nondet.
arab_rim(0,  "" ).
arab_rim(Arab, Rim):- zamena(A1, R1), A2 = Arab - A1, A2 >= 0,
                        arab_rim(A2, R2), append(R1, R2, Rim).
Ответить с цитированием
  (#102 (permalink)) Старый
ayax ayax вне форума
Member
 
Сообщений: 63
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 18.08.2016
По умолчанию 30.03.2018, 20:39

Теперь приложение по переводу из римских в арабские:
prolog Код:
:- module rim_arab.
:- interface.
:- import_module io.
:- pred main(io::di, io::uo) is cc_multi.
:- implementation.
:- import_module int, string, list.
        main(!IO):-
    io.format("Vvedite Rim = ", [], !IO),
    io.read_line_as_string(Result, !IO),
    (if Result = ok(Rim),      
        rim_arab(Rim, Arab)
then io.format("Rim(%s) ===> Arab(%i)\n", [s(Rim), i(Arab)], !IO),
        main(!IO)
else io.format("I dind`t expect that...\n", [], !IO),
        main(!IO)
).
:- pred zamena(int::out, string::out, int::in) is nondet.
zamena(1000, "M",  1). zamena(900,  "CM", 2). zamena(500,  "D",  1). zamena(400,  "CD", 2).
zamena(100,  "C",  1). zamena(90,   "XC", 2). zamena(50,   "L",  1). zamena(40,   "XL", 2).
zamena(10,   "X",  1). zamena(9,    "IX", 2). zamena(5,    "V",  1). zamena(4,    "IV", 2).
zamena(1,    "I",  1).
:- pred rim_arab(string::in, int::out) is nondet.
rim_arab("", 0).
rim_arab(Rim, Arab):- (zamena(A1, R1, 2), append(R1, R2, Rim);
                       zamena(A1, R1, 1), append(R1, R2, Rim)),
                       rim_arab(R2, A2),  Arab = A1 + A2.
Код компилируется, при вызове exe выводится приглашение к вводу числа, но после ввода любого римского числа срабатывает ветвь else ...
Ветвь else срабатывает всегда ...

Последний раз редактировалось ayax; 30.03.2018 в 20:43
Ответить с цитированием
  (#103 (permalink)) Старый
ayax ayax вне форума
Member
 
Сообщений: 63
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 18.08.2016
По умолчанию 15.04.2018, 16:40

prolog Код:
:- module rim_arab.
:- interface.
:- import_module io.
:- pred main(io::di, io::uo) is cc_multi.
:- implementation.
:- import_module int, string, list.
            main(!IO):-
      io.format("Vvedite chislo = ", [], !IO),
      io.read_line_as_string(Result, !IO),
(if      Result = ok(Rim),     
         rim_arab(Rim, Arab)
then  io.format("Rim = %s ===> Arab = %i\n", [s(Rim), i(Arab)], !IO),
            main(!IO)  
else  io.format("I dind`t expect that...\n", [], !IO),
            main(!IO)
).
:- pred zamena(int::out, string::out, int::out) is multi.
zamena(1000, "M", 1). zamena(900, "CM", 2). zamena(500, "D", 1). zamena(400, "CD", 2).
zamena(100,  "C", 1). zamena(90,  "XC", 2). zamena(50,  "L", 1). zamena(40,  "XL", 2).
zamena(10,   "X", 1). zamena(9,   "IX", 2). zamena(5,   "V", 1). zamena(4,   "IV", 2).
zamena(1,    "I", 1).
:- pred rim_arab(string::in, int::out) is multi.
rim_arab(Rim, Arab):- (zamena(A1, R1, 2), append(R1, R2, Rim);
                       zamena(A1, R1, 1), append(R1, R2, Rim)),
                       rim_arab(R2, A2),  Arab = A1 + A2.
rim_arab(_,0).
Ответить с цитированием
  (#104 (permalink)) Старый
ayax ayax вне форума
Member
 
Сообщений: 63
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 18.08.2016
По умолчанию 06.06.2018, 21:26

prolog Код:
:- module spisok.
:- interface.
:- import_module io.
:- pred main(io::di, io::uo) is semidet.
:- implementation.
:- import_module int, list.
       main(!IO):-
        Spisok = [2, 1, 3],
    io.write_string("Spisok = ", !IO),             
        S = head(Spisok),
    io.write_int(S, !IO),
    io.read_line_as_string(_, !IO).
:004: Error: main/2 must be `det' or `cc_multi'.
:004: In `main'(di, uo):
:004: error: invalid determinism for a predicate
:004: with I/O state arguments.


Что в коде неправильно, на что ругается Promt,
как изменить код ...
Ответить с цитированием
Ads
Ответ

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

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

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