Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
пособие_Пролог_часть1.doc
Скачиваний:
44
Добавлен:
13.11.2019
Размер:
1.36 Mб
Скачать

5.6.3. Метод перестановок.

Алгоритм сортировки списка путем перестановки элементов заключается в следующем: для того, чтобы упорядочить непустой список L = [X|T], необходимо:

  1. найти в списке L два смежных элемента X и Y, таких что X>Y,и поменять X и Y местами, получив таким образом новый список L1, затем рекурсивно применить эту процедуру к списку L1;

  2. если в списке L нет ни одной пары смежных элементов X и Y, таких что X>Y, то список L упорядочен.

Процедура sort_p использует процедуру perest, которая переставляет два смежных элемента в порядке возрастания (или убывания).

Предикат perest(L1,L2) истинен, если список L2 получается из упорядоченного списка L1 путем перестановки. Схема отношения этого предиката имеет вид:

perest(<список>, <список>).

В процедуре perest сравниваются числовые термы с помощью операций сравнения чисел >, <, >=, =< или символьные термы с помощью операций сравнения символов (@>, @<, @>=,@=<.

Предикат sort_p(L1,LS) истинен, если список LS получен из списка L1 путем упорядочения списка L1 по возрастанию методом перестановки элементов. Списки L1 и LS являются списками числовых термов.

Процедура sort_p(L1,LS) состоит из следующих правил:

sort_p(L,OL):  perest(L,L1),!,sort_p(L1,OL).

sort_p(OL,OL).

perest([X,Y|T],[Y,X|T]): X>Y.

perest([Z|T],[Z|T1]): perest(T,T1).

6. Стандартные предикаты языка Пролог.

    1. Арифметические предикаты.

Пролог рассчитан, главным образом, на обработку символьной информации, при этом потребность в арифметических вычислениях относительно мала. Поэтому и средства для таких вычислений весьма просты. Для выполнения основных арифметических действий можно воспользоваться несколькими предопределенными операторами:

X+Y  сложение,

X-Y  вычитание,

X*Y  умножение,

X/Y  деление,

X//Y  целочисленное деление ,

X^Y  возведение в степень,

X/\Y  побитовая конъюнкция (для целых чисел),

X\/Y  побитовая дизъюнкция (для целых чисел),

X<<Y  побитовый сдвиг влево на Y позиций (для целых чисел),

X>>Y  побитовый сдвиг вправо на Y позиций(для целых чисел),

X mod Y  остатот от деления X на Y(для целых чисел),

abs(X)  абсолютная величина X,

acos(X)  арккосинус X,

asin(X)  арксинус X,

atan(X)  арктангенс X,

cos(X)  косинус X,

sin(X)  синус X,

exp(X)  экспонента X,

ln(X)  натуральный логарифм X,

log(X)  логарифм по основанию 10,

sqrt(X)  квадратный корень X,

tan(X)  тангенс X,

round(X,N)  округление X до N десятичных знаков (0≤N≤15).

Арифметические термы (выражения) строятся из атомов и переменных с помощью арифметических операций. Допускается инфиксная и префиксная записи арифметический выражений. Арифметические термы без переменных являются константами.

6.2. Предикаты сравнения арифметических выражений и символьных термов.

Рассмотрим встроенные арифметические предикаты для унификации арифметических выражений. Пусть E1 и E2 ─ арифметические выражения. В Прологе существуют следующие встроенные предикаты для сравнения арифметических выражений:

E1>E2 истинно, если Е1 больше Е2,

E1<E2 истинно, если Е1 меньше Е2,

E1>=E2 истинно, если Е1 больше или равно Е2,

E1=<E2 истинно, если Е1 равно или меньше Е2,

E1=:=E2 истинно, если Е1 равно Е2,

E1=\=E2 истинно, если Е1 равно Е2,

E1=E2 истинно, если Е1 и Е2 сопоставимы,

E1\=E2 истинно, если Е1 и Е2 несопоставимы,

X is E истинно всегда, и неконкретизированной переменной присваивается значение Е.

Пусть E1 и E2 ─ символьные термы. Для сравнения символьных термов используются другие встроенные предикаты:

E1@>E2 истинно, если терм Е1 больше терма Е2,

E1@<E2 истинно, если терм Е1 меньше терма Е2,

E1@>=E2 истинно, если терм Е1 больше или равен терму Е2,

E1@=<E2 истинно, если терм Е1 равен или меньше терма Е2.

Символьные термы упорядочены в алфавитном порядке; терм r больше терма a.

Рассмотрим отличительные особенности перечисленных выше предикатов на примерах.

Пример 1.

Оператор унификации “=” Оператор “is”

? – X=1+2. ? – X is 1+2.

X=1+2 -> X=3 ->

YES YES

В случае унификации сопоставляются переменная Х составной терм 1+2, и устанавливается, что Х сопоставима с 1+2 при подстановке {X=1+2}.

Оператор is заставляет систему вычислить значение выражения справа от обозначения оператора, и это значение сопоставить с переменной X.

Пример 2.

? – X is 3/2,Y is 3//2.

X=1.5 ->

Y=1 ->

YES

Различие между операторами унификации “=” и арифметического сравнения “=:=” состоит в том, что при выполнении оператора “=” система не производит вычислений, а оператор “=:=” производит вычисление выражений и сравнение и значений.

Пример 3.

Оператор унификации “=” Оператор сравнения “=:=”

? – 1+2=2+1. ? – 1+2 =:= 2+1.

NO YES