Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекц по Visual Prolog.doc
Скачиваний:
4
Добавлен:
02.05.2019
Размер:
937.47 Кб
Скачать

1.1 Стандартні предикати обробки рядків

Для роботи зі стандартними предикатами треба знати, які аргументи повинні бути конкретизованими при виклику предикату, і які повинні бути вільними. Для цього використовуються наступні позначення:

( і ) input (вхідні параметри);

(o) output (вихідні параметри).

Вхідні і вихідні аргументи певного предикату називають потоком параметрів.

Стандартні предикату обробки рядків працюють в декількох режимах. Тобто, кожний предикат обробки рядків може об’єднувати в собі декілька функцій. Для роботи кожної функції використовують свій варіант потоку параметрів. Таким чином, робота певної функції предикату залежить від варіанту потоку параметрів(конкретизації аргументів).

Для всіх предикатів роботи з рядками працюють наступні правила:

  • якщо предикат повертає значення істинна, то при виконанні предикату вільні змінні конкретизуються значенням, інакше змінні не одержують значення;

  • від порожнього рядка не можна відокремити частину, тому предикат повертає неправду;

  • якщо будь – яку дію виконати не можна, то предикат повертає неправду.

Предикати побудови, контролю та розподілу рядків

Предикати можуть відокремлювати частину рядку, приєднувати рядок чи символ до початку іншого рядку, перевіряти з чого починається або чим закінчується рядок.

Предикат Frontchar (Рядок, Символ, Залишок)

(string, char, string)

Предикат працює з першим символом рядку.

Режими роботи предиката залежать від потоку параметрів, тобто від конкретизації змінних:

  1. (і, o, o) поділяє рядок на перший символ і його залишок.

Наприклад: do: - readln (S), frontchar (S, C, R), write (С,” ”,R).

При S = ”Prolog” змінні одержать C=’P’, R=”rolog”.

При S = “” предикат повертає fail.

  1. (o, i, i) приєднує символ до початку рядка

Наприклад: do: - readchar(S1), readln (S2), frontchar (S, S1, S2), write(S).

При S1=’P’, S2=”ascal” одержимо S=”Pascal”.

  1. (і, і, o) перевіряє, чи починається рядок із зазначеного символу.

Приклад1: do(Str): - frontchar (“Prolog”,'P',R), write (“Так”).

Предикат повертає R=”Prolog

Приклад2: do(Str): - frontchar (“Prolog”,'G',R), write (“Так”).

Предикат повертає fail.

  1. (і, o, і) перевіряє, чи дорівнює залишок рядка після відділення першого символу, зазначеному.

Приклад1: do: - frontchar (“Пролог”,C , ”ролог”), write(“Так ”).

Предикат повертає C=’P’.

Приклад2: do: - frontchar (“Пролог”,C , ”лог”), write(“Так ”).

Предикат повертає fail.

  1. (i, i, i) перевіряє, чи складається рядок з вказаних частин.

Приклад1: do: - frontchar (“Пролог”,’П’ , ”ролог”), write(“Так ”).

Предикат повертає True.

Приклад2: do: - frontchar (“Пролог”,’П’ , ”ол”), write(“Так ”).

Предикат повертає fail.

Треба пам’ятати, що другий аргумент предикату має тип char. Тому для застосування змінної типу char у предикатах, що працюють з типом string, використовуйте предикат перетворення типу даного str_char.

Предикат Fronttoken (Рядок, Лексема, Залишок)

(string, string, string)

Будемо називати лексемою рядок англійських символів, який має певний зміст для того контексту, в якому він вживається. За даним означенням лексемою буде слово природної мови.

Предикат працює з першою лексемою рядку. Предикат не працює з кирилицею. Якщо рядок починається з пропуску, то пропуск відкидається.

Режими роботи предиката залежать від потоку аргументів, тобто від конкретизації змінних:

  1. (і, o, o) розділяє рядок на перше слово і його залишок. Пропуск переноситься в залишок рядку.

Приклад1: Fronttoken (“Студент здав іспит”, W, R)

Предикат повертає W = “Студент”, R = “ здав іспит”.

Приклад2: Fronttoken (“”, W, R)

Предикат повертає fail.

  1. (o, і, і,) приєднує слово до початку рядка. Не вставляє пропуск між словом і рядком.

Наприклад: Fronttoken (Str, “Студент”, “ здав іспит”)

Str = “Студент здав іспит”.

  1. (і, і, o) чи починається рядок із зазначеного слова.

Приклад1: Fronttoken (“Студент здав іспит”, ”Студент”, R).

Предикат повертає R = “ здав іспит”

Приклад2: Fronttoken (“Студент здав іспит”, ”Студ”, R).

Предикат повертає fail.

  1. (і, o, і) перевіряє, чи дорівнює залишок рядка зазначеному.

Приклад1: Fronttoken (“Студент здав іспит”, W, “ здав іспит”)

Предикат повертає W = ”Студент”

Приклад2: Fronttoken (“Студент здав іспит”, W, “ здав”)

Предикат повертає fail.

  1. (і, і, і) перевіряє, чи дорівнює рядок зазначеним частинам, де частини – перше слово рядка і залишок.

Приклад1: Fronttoken (“Студент здав іспит”, ”Студент”, “ здав іспит”). Предикат повертає TRUE.

Приклад2: Fronttoken (“Студент здав іспит”, ”Студент”, “ іспит”). Предикат повертає fail.

Предикат Frontstr (Кількість символів, Рядок, Рядок1, Рядок2)

(integer, string, string, string)

( і, і, о, о)

Предикат відокремлює зазначену кількість символів від початку рядка. Відокремлений рядок заноситься в другий аргумент, а залишок заноситься в третій аргумент.

Наприклад: frontstr (5, “Програмування”, First, End)

Предикат повертає: First = „Прогр”, End = „амування”

Предикат Concat (Str1, Str2, Str)

(string, string, string)

Предикат працює з рядками, без ознаки що це за рядки. Для роботи предикату потрібно хоча б два конкретизованих аргументи:

  1. (і, і, o) відбувається з'єднання рядків за принципом Str1+Str2 = Str.

Наприклад: concat (“V ”, “2.0”, Str)

Str = “V 2.0”

  1. (і, o, і) виділяється маскою(рядком) початок іншого рядку.

Приклад1: concat (“Pr”, М, “Prolog”), де маска “Pr”.

Предикат повертає М = “olog”

Приклад2: concat (“PР”, М, “Prolog”), де маска “PР”.

Предикат повертає fail.

  1. (o, і, і) виділяється маскою кінець рядку

Приклад1: concat (R, “віт”, “світ”). R = ”с”.

Приклад2: concat (R, “вік”, “світ”). Предикат повертає fail.

  1. (i, i, i,) перевіряє, чи складається рядок із зазначених частин.

Приклад1: concat(“с”, “віт”, “світ”). Предикат повертає true.

Приклад2: concat(“г”, “віт”, “світ”). Предикат повертає fail.

Предикат контролю ідентифікатору

Предикат Isname (Рядок)

(symbol)

( і )

Предикат перевіряє, чи побудований рядок за правилами ідентифікатору. Ідентифікатор складається з англійських букв, цифр і знаку підкреслення і має довжину <=250. Ідентифікатор починається буквою або знаком підкреслення.

Предикат ігнорує пропуски, що стоять на початку рядку або в кінці.

Наприклад: isname (f3d) предикат повертає TRUE;

isname(2rtb) предикат повертає FAIL.

Довжина рядку

Предикат Str_len (Рядок, Довжина)

(string, integer)

Предикат працює в 3х режимах:

  1. При конкретизації змінних (і, o) предикат знаходить довжину рядка.

Наприклад, do: - str_len (“abc”, Dl), write (Dl). Вивід: 3

  1. При конкретизації змінних (і, і) порівнюється, чи дорівнює довжина рядка вказаній.

Наприклад, do: - str_len (“abc”, 3), write (“Так”). Якщо довжина рядка інша, то предикат повертає FAIL.

  1. При конкретизації змінних (о, і) предикат формує рядок із пропусків зазначеної довжини.

Наприклад, do:-str_len(S, 43) у змінній S формується рядок з 43 пропусків.

Предикат subchar (Рядок, Позиція, Символ)

(і, і, о)

Предикат одержує символ рядку за позицією. Позиції рахуються з 0. Якщо позиція більше ніж довжина рядку, робота предикату закінчується помилкою.

Предикат substring (Вхідний _ Рядок, Позиція, Довжина, Підрядок)

(і, і, і, о)

Предикат одержує з рядку підрядок за номером початку підрядку і його довжиною. Вхідний рядок не змінюється. Якщо Позиція або Довжина виходять за межі рядку робота предикату закінчується помилкою.

Предикат searchchar (Рядок, Символ, Позиція)

(і, і, о)

Предикат шукає символ в рядку і повертає позицію першого знайденого символу. Якщо символ відсутній в рядку, то предикат повертає fail. При наявності у рядку декількох вказаних символів треба повторити дії для залишку рядку.

Предикат searchstring (Рядок, Підрядок, Позиція)

(і, і, о)

Предикат шукає підрядок в рядку і повертає позицію першого знайденого підрядка. Якщо підрядка немає або підрядок завдовжки рядка, то предикат повертає fail.

Предикати перетворення доменів даних

Предикати перетворюють рядки до певних доменів даних або навпаки.

Предикат str_char (Рядок, Символ)

(string, char)

Предикат працює в таких режимах роботи:

(i, o) – перетворює рядок з одного символу типу string в символ типу char.

(o, i) - перетворює символ типу char в рядок з одного символу типу string.

(і, і) - порівнює рядок з одного символу типу string і один символ типу char.

При довжині рядку більше одного символу предикат повертає fail.

Наприклад: str_char (“K”, R) предикат повертає R = ‘K’

str_char (R, ‘K’) предикат повертає R = “K”

str_char (“K”, ‘K’) предикат повертає true.

str_char (“Kb”, ‘K’) предикат повертає fail.

Предикат str_int (Рядок, Ціле число)

(string, integer)

Предикат працює в таких режимах роботи:

(i, o) – перетворює рядок типу string в ціле число.

(o, i) - перетворює ціле число в рядок типу string.

(i, i) - порівнює ціле число з його текстовим подаванням типу string.

Наприклад: str_int (“273”, N) предикат повертає N = 273

str_int (S, 273) предикат повертає S = “273”

str_int (“273”, 273) предикат повертає true.

Предикат str_real (Рядок, Дійсне число)

(string, real)

Предикат працює в таких режимах роботи:

(i, o) – перетворює рядок типу string в дійсне число.

(o, i) - перетворює дійсне число в рядок типу string.

(і, i) - порівнює дійсне число з його текстовим подаванням типу string.

Наприклад: str_real (“34.15”, R) предикат повертає R = 34.15

str_real (R, 12.3) предикат повертає R = ”12.3”

str_real (”12.3”, 12.3) предикат повертає true.

Предикат char_int (Символ, Код символу)

(char, integer)

Предикат працює в таких режимах роботи:

(i, o) – перетворює символ в код символу.

(o, i) - перетворює код символу в символ.

(і, i) - порівнює код символу з символом.

Наприклад: char_int (‘A’, R) предикат повертає R = 65

char_int (R, 97) предикат повертає R = ‘a’

char_int (‘a’, 97) предикат повертає true.

Предикат upper-lower (Символи верхнього регістру, Символи нижнього регістру)

(string, string)

(symbol, symbol)

Предикат працює в таких режимах роботи:

upper-lower (i, o) – перетворює символи верхнього регістру в символи нижнього регістру.

upper-lower (o, i) - перетворює символи нижнього регістру в символ верхнього регістру.

upper-lower (і, i) - порівнює символи нижнього регістру з символами верхнього регістру.

Наприклад: upper-lower (‘A’, R) предикат повертає R = ‘a’

upper-lower (R, ‘a’) предикат повертає R =‘A’

upper-lower (‘A’, ‘a’ ) предикат повертає true.

Предикат term_str (Тип терму, Терм, Рядок)

(symbol, _ , string), де 2 аргумент будь-якого типу.

Предикат term_str – універсальний. Його можна застосовувати для перетворення даних будь-якого типу.

Предикат працює в таких режимах роботи:

(i, i, o) – перетворює дане будь-якого типу в рядок.

(i,o, i) - перетворює рядок в дане вказаного типу.

Наприклад: term_str (real, 12.6, Str) предикат повертає Str = “12.6”.

term_str (real, R, “12.5”) предикат повертає R = 12.5

Розглянемо приклад використання розглянутих стандартних предикатів.

Завдання: Сформувати рядок зазначеної довжини.

Do: - write (“Уведіть рядок”), readln (Str), write (“Уведіть довжину рядка”), readint (D1), form (Str, D1).

form (Str, D1): - str_len (Str, D1), write (Str), nl;

str_len (Str, D), D < D1, D2 = D1 – D,

str_len (Str1, D2), Concat (Str, Str1, S), write(S), nl;

write (“Рядок має великий розмір”),

frontstr (D1, Str, Str1, Str2), write (Str1), nl.

В програмі вводиться рядок і яка в нього повинна бути довжина.

Рядок вказаної довжини просто виводиться. Якщо довжина рядка менше, то рядок доповнюється пропусками. Інакше виводиться частина рядка.