Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Spec_Mov_3k_4k_Lect.doc
Скачиваний:
0
Добавлен:
01.03.2025
Размер:
1.46 Mб
Скачать

Основные сведения об арифметических предикатах

Данные об арифметических предикатах можно обобщить следующим образом:

  1. В арифметических выражениях символ = связывает левую и правую части отношения “=”. Одна и та же переменная не может использоваться слева и справа от символа “=”, т.к. такое отношение будет заведомо можно.

  2. Помимо функций +, - , *, /,div, mod, являющихся фактически именем некоторого значения в выражениях (функтором), в выражениях можно использовать скобки ( ), управляющие приоритетом операций, а также функции: sin(x), cos(x), tan(x), arctan(x), exp(x), ln(x), lg(x), eqrt(x), round(x) (округление ), abs(x), random(x) – случайное число в диапазоне [0,1], применять композицию функций.

  3. Операции отношений следующие: =, <>, <, >, <=, =>. Операции отношений можно применять ко всем базовым областям данных, в т.ч. к символьному типу, но не к домену file.

Внелогические предикаты

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

Пример

predicates

zadanie

zadacha(string)

……..

clauses

zadanie:- makewindow(10, 120, 1, “Лаб. работа №1”, 5, 5, 10, 70), write(“Имя файла?”), nl, readln(FlStrname), zadacha(FlStrname), nl, removewindow, write(“Задание выполнено!”), getchar(_), exit.

……..

В этой программе утверждение цели “zadanie” необходимо ввести с системного окна, поскольку секция goal в программе отсутствует. Выполнение программы начинается с отображения окна с заголовком “Лаб. работа №1”, затем в этом окне выводится запрос - “Имя файла?”. Введенная с клавиатуры строка унифицирует переменную FlStrname. Собственно выполнение программы обеспечивает предикат zadacha. После завершения задачи в системном окне появится сообщение “Задание выполнено!” и после ввода произвольного символа с клавиатуры работа программы и Турбо-Пролога будет завершена. Если при выполнении цели zadacha будет выполнен возврат, то в системном окне появится сообщение “not”. Повторных решений не будет, т.к. внелогические предикаты не создают точек решений. В данной программе, если не указывать предикат exit, то в случае получения решения управление передается меню Турбо-Пролога.

Работа с файлами

Когда запускается программа, то стандартными устройствами ввода/вывода являются screen (экран) и keyboard (клавиатура). Для применения внелогических предикатов ввода/вывода к файлам (устройствам) необходимо их открыть (openread, openwrite, openmodify, openappend), переопределить текущее устройство чтения или записи (readdevice, writedevice) и затем выполнять чтение или запись (read,…, write,…). Одновременно можно открыть несколько файлов, однако только одно устройство является текущим устройством чтения и только одно устройство является текущим устройством записи.

Пример

Программа обеспечивает создание нового файла из исходного выбрасыванием строк, начинающихся символом А.

domains

str = string

file = inp; out

predicates

mainjob (str,str)

zadacha

obr (str, char)

clauses

mainjob (Flnm 1,Flnm 2): - openread (inp, Flnm1),

openwrite (out,Flnm2), readdevice (inp), writedevice (out), radacha.

radacha: - not (eof(inp)), readln (Str), froutchar (Str, C, _),

obr (Str, C), zadacha.

zadacha: - eof (inp), closefile (inp), closefile (out).

obr (Str, C): - c<>’A’, write (Str), nl.

obr (_, C): - C = ‘A’.

В целевом предложении вызывается mainjob с аргументами – именами файлов. Вновь имеем пример интеративной программы. Предикат not(Цель) удовлетворяется, если Цель не м.б. согласована.

Предикат readlr (Str) читает очередную строку, frontchar (Str1, C, Str2) выделяет 1-й символ из Str1 в C и дает остаток в Str2, nl - выдает в поток символ “конец строки”.

В данном случае имеем пример детерминированной программы. Она дает одно решение. Это обеспечивается использованием детерминированных предикатов radacha и obr, каждый из которых дает точно одно решение за счет указания всех возможных условий в начале, - not(eof(…)) или eof(…), C <> ’A’ или c = ’A’.

Программа осталась бы детерминированной и в случае другого определения предиката obr в виде: “obr(_, ‘A’)”, или если поменять местами порядок определений.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]