Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Языки программирования > Prolog
Перезагрузить страницу Вспомогательные функции работы со стрками в SWI Prolog
Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
rrrFer rrrFer вне форума
Р.Р.Р.Ф.Е.Р
 
Сообщений: 207
Сказал(а) спасибо: 12
Поблагодарили 8 раз(а) в 8 сообщениях
Регистрация: 08.09.2008
Адрес: Russia, Krasnoyarsk
По умолчанию Вспомогательные функции работы со стрками в SWI Prolog - 28.08.2014, 10:58

Вобщем, где-то год назад я писал более-менее большую штуку на SWI Prolog. Не очень меня порадовало как там строки устроены.
Часть проблем я описывал полтора года назад тут: Ввод данных в SWI Prolog | блог программиста (но решения там были похуже, мне кажется).
Я написал маленький вспомогательный модуль, который мне помогал. Делюсь кодом:
Код:
:- module(strings, [
    op(200, xfy, <-), (<-)/2, 
    printStringList/1, rd_line/1, 
    op(200, xfy, ?), (?)/2]).

%% проверяет возможность разложения строки R на подстроки из списка
%% "asdf" <- [X, "d", Y] => X = "as", Y = "f"
R <- ([A, B]):-
    !, append(A, B, R).
R <- ([A|T]):-
    append(A, TR, R),
    TR <- T,
    append(A, TR, R), !.

%% выполняет преобразование строки в список кодов и наоборот
%[] ? ([]):-!.
%[HS|TS] ? ([H|T]):-
%    char_code(HS, H), TS ? T.

String ? (List):-
    string_to_list(String, List).

%% считывает список кодов с текущего устройства ввода
rd_line(Str):-
    get_code(H), (
        code_type(H, end_of_line), !, Str = [];
        code_type(H, end_of_file), !, Str = [];
        Str = [H|T], rd_line(T)
    ).

%% проверяет является ли список кодов целым беззнаковым числом
is_num([]):-!.
is_num([H|T]):- is_digit(H, 10, _), is_num(T).

%% выводи список "строк"
printStringList([]):-!.
printStringList([H|T]):-
    SH ? H, write(SH), printStringList(T).
Вобщем суть в том, что есть "строки", есть 'строки' и есть строки
("hello", 'hello' и hello). Последнее я лично не пользую, это то ли атом, то ли что... есть там какой-то atom_to_string или типа того, а первыедва используются и кастуются друг в друга регулярно.
Строка которая в двойных кавычках - это на самом деле список кодов типа [\123\456\678] в юникоде вроде как. А двойные кавычки - не более чем синтаксический сахар (более удобная форма ввода этого списка кодов).

Со списком кодов удобно работать, есть куча полезных функций (встроенных), ведь это список, поэтому все что работает со списками - работает и со списком кодов, а со строками в одинарных кавычка -неудобно.

Для ввода списка кодов я использую rd_line, есть встроенная функция (название не помню), но не во всех версиях swi prolog (у меня не работала).

Для преобразования списка кодов в строки и наоборот использую оператор ?. Есть встроенная string_to_list, но то-ли она не работала у меня в какой-то версии swi, то-ли работала как-то не так, одно время я пользовал вариант, который сейчас закомментирован. Лично мне кастовать туда-обратно приходится постоянно, поэтому оператор ? я таки предпочитаю string_to_list, чтобы печатать меньше.

Оператор <- я использовал для разложения строки на части. Использовать примерно так:
prolog Код:
Str = "123, 456 | 'hello world'",
Str <- [Num1, ", ", Num2, " | '", Str, "'"].

%% В результате
%%   Num1 = "123",
%%   Num2 = "456",
%%   Str = "hello world".


Вместо этого можно и нужно наверное юзать регулярные выражения, но мне было лень разбираться с тем, как их приделать к swi prolo (из коробки их нет, надо что-то собирать руками, я собрал, но подключить не смог).

Ну и всякие другие мелочи. Все это появилось, очевидно, из за огромного радиуса кривизны моих рук, но мне помогло, МБ еще кому-нибудь жизнь упростит.


Решенные задачи на Prolog: http://pro-prof.com/forums/forum/programming/prolog-help
Введение в логическое программирование: http://pro-prof.com/archives/2362
Ответить с цитированием
  (#2 (permalink)) Старый
Винитарх Винитарх вне форума
Специалист
 
Аватар для Винитарх
 
Сообщений: 7,884
Сказал(а) спасибо: 2
Поблагодарили 293 раз(а) в 293 сообщениях
Регистрация: 01.03.2003
Адрес: Краснодар
По умолчанию 29.08.2014, 12:45

Цитата:
Сообщение от rrrFer Посмотреть сообщение
Str <- [Num1, ", ", Num2, " | '", Str, "'"].
В Рефале есть лаконичная языковая конструкция, выполняющая подобные действия со списками. Очень полезная и удобная штучка.
Ответить с цитированием
Ads
Ответ

Метки
string , swi prolog

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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Локальные, вспомогательные функции, функционалы Sergio-X86 Lisp 1 30.09.2010 20:28
Функции для работы с памятью imported_nina Haskell 2 21.05.2010 18:03
Имеются ли api функции для работы с таблицами excel beacon WinAPI 1 01.09.2008 18:01
Вспомогательные коды c++ Мысли вслух 12 14.10.2006 08:18
функции работы со строками Pyshkin Delphi 7 28.09.2006 21:18
функции visual prolog dazenita Prolog 3 27.12.2005 21:01
Как понять принцип работы функции legrandmetre С/С++ 5 27.11.2005 16:28
API-функции для работы с MathCAD Павел Безяев Visual C++ 9 16.02.2005 18:45
Функции работы с таймером Vasis WinAPI 2 18.11.2004 17:32
Как связать MainFrame View Document и вспомогательные окошки OKey Visual C++ 6 23.01.2004 11:50
Функции для работы с com портом Anonymous WinAPI 1 26.11.2003 12:18
Какие функции имеются под MFC или API-функции для работы с Hint Anonymous Visual C++ 1 12.10.2003 00:15



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