Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Можно сделать и по другому — сделать на ПРОЛОГе бbблиотеку или DLL.
Я указываю проблему Prolog это интеграция.
Сделать на нем какой либо интерфейс взаимодействия с пользователем тот еще цирк.
lexr(S,R):- list_text(L,S), delb(L,L1),lexr1(L1,R),!.lexr/2 последовательно вызывает три предиката: list_text/2, delb/2, lexr1/2. Это все, что из нее понятно. А еще в ней, на самом деле, происходит последовательное присвоение (не уверен, что это правильный термин, правда) результатов предикатов для их использования в следующем предикате.
let lexer input =
let rec lexer input =
//очень грубый пример, просто чтобы показать матчинг и рекурсию
match input with
| [] -> []
| [h; t] -> [term(h); lexer(t)]
input
|> String.ToCharArray
|> Seq.filter (fun c -> c != ' ')
|> lexer
[term(h); lexer(t)], а term(h) :: lexer(t) предикат lexr/2 последовательно вызывает три предиката: list_text/2, delb/2, lexr1/2.
Эта фраза не совсем корректна, в логической парадигме нет понятия «вызов функции» или вызова чего бы то ни было. Точно также нет присвоения переменных.
не на этом языке приводятся?
Если это другой язык — можно на нем написать.
let lexer = String.toCharArray >> Seq.filter (fun c -> c != ' ') >> Rx.window (fun c -> c |> Char.IsDigit |> not)
Rx.window — это вполне типовая операция над последовательностями, которая превращает последовательность в последовательность последовательностей, разделяемых по условию.Я Вам стремлюсь показать природу языка
а ВЫ говорите о фичах
Моя цель — «смотри как ты можешь сделать!»
А под словом «фича» я понимаю специализированные процедуры, встраиваемые в язык.
Что я могу ответить, если не знаком с этой системой?
Мой тезис в том, что все системы парсинга основаны на использовании заготовленных библиотек соответствующих процедур, т.е. это просто парсеры с параметрами. Пользователь задает параметры и наслаждается результатом.
Суть, природу языка демонстрируем
А пользователь должен его выучить?
А если сделать так, чтобы пользователю не требовались консультации и обучение?
Современные языки позволяют многое из того, что показывает автор, записать понятнее и очевиднее.
Тут немедленно возникает разумный вопрос: под какие же задачи пролог заточен?Вот этот комментарий частично отвечает на ваш вопрос. Пример автоматического доказательства теоремы можете посмотреть в этой статье, я тоже на эту тему писал.
А еще в ней, на самом деле, происходит последовательное присвоение (не уверен, что это правильный термин, правда) результатов предикатов для их использования в следующем предикате
То есть скрытая императивность.
В действительности же чистой декларативности нет нигде, потому что две одинаковые (декларативно) программы могут в реальности вести себя совершенно по-разному
То, что во все модные языки вставляют средства работы со списками, говорит о неизбежности декларативного подхода
никак не мог понять вообще о чём речь (какие-то предикаты, атомы, арность
напоминает навороченную булеву алгебру
Специально написал эти статьи, чтобы показать, как работать с ПРОЛОГом без всей этой математической терминологии
Она нужна теоретикам, программистам она никак не помогает!
Свое утверждение о ненужности дизъюнктов и понятия клауз Хорна я обосновываю этой публикацией.
А Вы чем обосновываете свое утверждение? Тем что все учебники по ПРОЛОГу забиты этой терминологией, не так ли?
а в третьем как [H|T] – произвольный непустой список.
И до сих пор не понимаю как [H|T] может быть связано с произвольным непустым списком. Я до списков ещё не дошёл.
domains
list=integer* /* Тип элемента списка - integer*/
predicates
sum_list(integer, list)
sum_list(integer, integer, list)
clauses
sum_list(Summa, L) :- sum_list(Summa, 1, L). /* public */
sum_list(0, Nom_el, []). /* граничный случай*/
/* суммируем с нечетным элементом, иначе - отсечение */
sum_list(Summa, Nom_el, [H|T]) :- Nom_el mod 2 <> 0,
!,
Nom_el_sub = Nom_el + 1,
sum_list(PodSumma, Nom_el_sub, T),
Summa = PodSumma + H.
/* альтернатива - для четного элемента */
sum_list(Summa, Nom_el, [H|T]) :- Nom_el_sub = Nom_el + 1,
sum_list(Summa, Nom_el_sub, T).
goal
L=[2,4,3,1,7,2,4],
sum_list(S,L),
write("Summa = ",S).
Парсинг на языке Prolog