Простые и составные объекты

Работа с данными. Простые и составные объекты.

Арифметические выражения.

Возможности вычислений арифметических (целочисленных и вещественных) выражений, значений функций, сравнения чисел и строк, управления выводом информации на экран и запросов данных у пользователя в языке Prolog аналогичны возможностям таких языков как C, Pascal, Basic.

Арифметические выражения состоят из операндов (чисел и переменных), операторов (+, – , *, /, div, mod) и скобок.

Visual Prolog использует инфиксную нотацию, которая означает, что оператор располагается между операндами (X+4), а не предшествует им (+(X,4)).

Символы в правой части от знака равенства (который является предикатом =) составляют арифметическое выражение.

Значение выражения может быть вычислено, только если все переменные в момент вычисления определены. При этом вычисления производятся в порядке, определяемом приоритетом операции. Операции с высшим приоритетом выполняются первыми. Предикат равенства B=125 div Z+24. конкретизирует значение переменной B в зависимости от значения переменной Z. Например, при Z = 25 переменная B получит значение 29. Если же его несколько переопределить с использованием скобок B=125 div (Z+24), то при Z = 1 переменная B получит значение 5. При этом мы руководствовались общепринятым и в математике, и в других языках программирования порядком вычислений:

1) если выражение содержит подвыражение в скобках, то это подвыражение вычисляется первым;

2) если выражение содержит операции умножения, деления, div, mod, то эти операции выполняются слева направо;

3) если выражение содержит операции сложения (+) и вычитания (–), они выполняются также слева направо.

Приоритет операций: +, – 1

*,/ mod, div 2

–, + (унарные) 3.

Visual Prolog может сравнивать арифметические выражения так же, как символы, строки и идентификаторы. В Прологе разрешены следующие отношения:

<, < =, =, >, > =, < > или > <,

при этом знак = может означать и оператор сравнения, и аналог оператора присваивания.

2. Ввод/вывод данных

Предикат (слайд 1)

write(arg1, arg2, arg3, ... , argN)

организует вывод значений констант и переменных в активное окно или устройство. Если аргументом предиката является переменная, то она не может быть свободной. Список аргументов arg (с предшествующей запятой) может отсутствовать.

Предикат (слайд 1)

writef (FormatString, arg1, arg2, arg3, ..., argN)

обеспечивает форматированный вывод данных.

Форматная строка ограничена двойными кавычками и может включать произвольный текст, управляющие символы и спецификации преобразования данных. Произвольный текст (не спецификации преобразования и не управляющие символы) непосредственно без изменений выводится на экран. Управляющие символы (перевод строки «\n», табуляция «\t» и т.д.) позволяют влиять на размещение выводимой информации на экране дисплея.

Спецификации преобразования данных предназначены для управления формой внешнего представления значений аргументов функции writef().

Обобщенный формат спецификации преобразования имеет вид:

% ширина _поля. точность спецификатор

Среди элементов спецификации преобразования обязательными являются только два: символ «%» (именно вместо него происходит встраивание значения переменной или выражения в строку вывода) и спецификатор.

В задачах вычислительного характера будем использовать спецификаторы:

- – индикатор выравнивания информации по левому краю поля вывода. По умолчанию принято выравнивание по правому краю.

d – целые десятичные числа;

u – целые десятичные числа без знака;

x – целые десятичные числа в шестнадцатеричной форме;

f – вещественные числа в форме с фиксированной точкой;

е – вещественные числа в форме с плавающей точкой;

g – запись вещественного числа в короткой форме;

с – символы;

s – строки.

Пример 1.(слайд 2)

GOAL

writef("\n Возможности предиката writef \n"),

A = "one",

B = 330.12,

C = 4.3333375,

D = "one two three",

writef("A = '%-7' \nB = '%8.1e'\n",A,B), %1

writef("A = '%' \nB = '%8.4e'\n",A,B), %2

writef("C = '%-7.7g' \nD = '%17.7'\n",C,D), %3

writef("C = '%-7.0f' \nD = '%10'\n",C,D), %4

writef("char:%c,decimal:%d,hex:%x,unsigned:%u",97,97,97,-97),nl. %5

Цели, сформулированные в данном примере, обеспечивают демонстрацию записи строки форматирования с использованием произвольного текста и спецификаторов. Заметим, что для Пролога знак апострофа не является служебным символом и поэтому свободно используется внутри строки форматирования. При выводе строки в терме 1 рассмотрена ситуация определения величины поля в 7 единиц и выравнивания вывода по левой границе поля. Терм 2 просто организует вывод строкиA и переменной B. В терме 3 на вывод строки Dвыделено 7 позиций. Поскольку длина этой строки равна 13, то происходит усечение, и строка выводится не полностью. Эта проблема устраняется в терме 4. Терм 5 демонстрирует возможности Пролога на уровне представления и интерпретации данных. Число 97 в формате %c представляется символом a, в десятичном – не изменяется, а в шестнадцатеричном – числом 61. В беззнаковом формате отрицательное число -97 за счет сложения с максимальным числом 4294967295 преобразовано в число 4294967199. Детально работа демонстрационной цели выглядит так:

Возможности предиката writef

A = 'one '

B = ' 3.3E+02'

A = 'one'

B = '3.3012E+02'

C = '4.333338'

D = ' one two'

C = '4 '

D = 'one two three'

char: a, decimal: 97, hex: 61, unsigned: 4294967199

n

Предикаты (слайд 3)

readint(Var1)

readreal(Var2)

readchar (Var3)

readln (Var4)

организуют ввод значений переменных. При этом из названия предикатов можно определить, что переменная Var1будет конкретизирована значением целого типа, переменная Var2 – значением вещественноготипа, переменная Var3 – значением символьного типа, а Var4 – значением строкового типа.

Предикаты ввода работают корректно в том случае, если вводимая последовательность символов может быть интерпретирована как значение соответствующего типа (используются допустимые символы, они введены в правильном порядке, соблюдается диапазон значений) и операция ввода закончена клавишей enter.

Предикат not

Обратимся к задаче, условие которой сформулировано в примере 1, а в примере 7 рассмотрены основные ее положения. После внесения в базу знаний данных о профессиях и персонах, мы приступили к описанию процедуры для предиката zanjat. Высказывание A – "повар – холостяк" позволило исключить для женщин профессию повара. В правилах Пролога это выглядит так:

zanjat(X,Y):-

persona(X), X=golubeva,

profession(Y) ), not(Y= povar).

Последняя запись not(Y= povar) обращает наше внимание на то, что в данном случае переменная Y не может быть конкретизирована значением povar. И только в этом случае предикат notбудет успешным.

В Прологе предикат not будет успешным, если не может быть доказана истинность данной подцели. Внутри предиката не могут быть использованы подцели со свободными переменными, поскольку это приводит к сообщению об ошибке. Ошибка возникает вследствие того, что для связывания свободных переменных в подцели, подцель должна унифицироваться с каким-либо другим предложением и выполняться. Правильным способом управления несвязанными переменными подцели внутри not является использование анонимных переменных.

Простые и составные объекты

Простые объекты данных

Простой объект данных – это переменная или константа.

Переменные Пролога локальны. Если два предложения содержат переменную, названную X, то это две различные переменные. Они могут быть связаны друг с другом, если совпадут во время унификации, но обычно они не оказывают влияния друг на друга. В Прологе переменная может быть связана с любым допустимым аргументом или объектом данных.

Константы включают символы (char), числа (integer или real) и атомы (symbol или string).

Символьные константы записываются в апострофах. Если перед константой стоит символ «\»(обратный слэш), то такая константа представляет собой специальную функцию.

Атомы имеют тип идентификатор (symbol) или строка (string). Отличие между ними заключается в машинном представлении и реализации и, в основном, синтаксически незаметно. Пролог автоматически преобразует типы между доменами symbol и string, поэтому можно использовать атомы symbol в доменах string и наоборот. Принято считать, что объект в двойных кавычках принадлежит домену string, а объект, не нуждающийся в кавычках, домену symbol.

Таблица 1.