Студопедия КАТЕГОРИИ: АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция |
Декартово произведение множеств.
Предикат dek определяет операцию декартова произведения двух множеств. Декартовым произведением двух множеств X={xi} и Y={yi} является множество Z, состоящее из пар элементов [xi, yi], где xi принадлежат множеству X, а yi принадлежат множеству Y. Предикат dek(X,Y,Z) ¾истинен, если множество Z является декартовым произведением множеств X и Y. Схема отношения того предиката имеет вид: dek(<список>,<список>,<список>). В процедуре dek используются дополнительные предикаты pro и pro(<терм>,<список>,<список>). Декларативное определение предиката pro(X,Y,Z) формулируется следующим образом. v Список Y состоит из одного элемента. Тогда список Z является списком пар вида [X, Yi]. v Список, определяющий множество Y можно разделить на голову Н и хвост T. Тогда список Z=[[X,H]|T1], если список список T1 есть результат процедуры pro(X,T,T1]. Декларативное описание предиката dek(X,Y,Z) формулируется следующим образом: v Список X состоит из одного элемента. Тогда список Z является результатом процедуры pro(X,Y,Z1. v Список, определяющий первое множество Х можно разделить на голову X и хвост T1. Если pro(X,Y,T2) и dek(T1,Y,T3) и append(T2,T3,Z) истинны, то Z есть декартово произведение списков X и Y.
Процедура pro(X,Y,Z) состоит из двух правил: pro(X,[Y],[[X,Y]|[]]). Процедура dek(X,Y,Z) состоит из двух правил: dek([X|[]],Y,Z):pro(X,Y,Z). append(T2,T3,Z).
Пример запроса к процедуре pro. ? ¾ pro(4,[1,2,3],Z). Z=[4,2],[4,3],[4,3]] Yes
Пример запроса к процедуре dek. ? ¾ dek([4,2][3,5,8],Z). Z=[[4,3],[4,5],[4,8], [2,3],[2,5],[2,8]] Yes
5.6 Пролог¾программы сортировки списков.
5.6.1. Метод прямого выбора. Наиболее распространены три метода сортировки списков: 1. метод сортировки путем прямого выбора; 2. метод сортировки путем вставки; 3. метод сортировки с использованием перестановок элементов. Алгоритм сортировки списка путем прямого выбора включает в себя следующие шаги: 1. В исходном списке S1 находится минимальный элемент Min и помещается в результирующий список S2. 2. Этот элемент удаляется из списка S1, и процедура поиска повторяется. С каждым шагом список S1 уменьшается. 3. Когда список S1 станет пустым, список S2 станет результирующим, упорядоченным по возрастанию списком. Процедура sort_vibor использует следующие процедуры: 1. sort1(<исходный список>, <накапливающийся список>, 2. delete(<терм>, <список>, <список > ) ¾ процедура удаления элемента из списка; 3. append(<список>, <список>, <список > ) ¾ процедура объединения списков; 4. minlist(<список>, <терм> ) ¾ процедура определения минимального элемента в списке; 5. min(<терм>, <терм>, <терм> ) ¾ процедура определения меньшего из двух термов. В 5-й процедуре сравниваются числовые термы с помощью операций сравнения чисел >, <, >=, =< или символьные термы с помощью операций сравнения символов (@>, @<, @>=,@=<. Предикат sort_vibor(L1,LS)истинен, если список LS получен из списка L1 путем упорядочения списка L1 по возрастанию методом прямого выбора. Списки L1 и LS являются списками числовых термов. Процедура sort_vibor(L1,LS)состоит из следующих правил: sort_vibor(L1,LS):¾sort1(L1,[],LS). sort1(L1,L2,LS):¾minlist(L1,Min),append(L2,[Min],L3), sort1([],LS,LS). delete(A,[A|B],B). append([],|L,L). append([X|L1],L2,[X|L3) :¾ append(L1,L2,L3). minlist([X],X). minlist([X,Y|T],M) :¾ minlist([Y|T],MinN),min(X,MinN,M). min(X,Y,X) :¾X=<Y. min(X,Y,Y) :¾X>Y.
5.6.2. Метод вставки.
Алгоритм сортировки списка путем вставки заключается в следующем: для того, чтобы упорядочить непустой список L = [X|T], необходимо: 1) упорядочить хвост списка, получив список OT; 2) вставить голову X списка L в упорядоченный список OT, поместив X в такое место списка OT, что список OT остался бы упорядоченным. Процедура sort_insert использует процедуру insert, которая вставляет терм в упорядоченный список, не нарушая упорядочивания. Предикат insert(X,L1,L2) ¾истинен, если список L2 получается из упорядоченного списка L1 путем вставки терма X без нарушения порядка. Схема отношения этого предиката имеет вид: insert(<терм>, <список>, <список>). В процедуре insert сравниваются числовые термы с помощью операций сравнения чисел >, <, >=, =< или символьные термы с помощью операций сравнения символов (@>, @<, @>=,@=<. Предикат sort_insert(L1,LS) истинен, если список LS получен из списка L1 путем упорядочения списка L1 по возрастанию методом вставки. Списки L1 и LS являются списками числовых термов. Процедура sort_insert(L1,LS) состоит из следующих правил: sort_insert([],[]). sort_insert([X|T],OL):¾sort_insert(T,OT),insert(X,OT,OL). insert(X,[],[X]). insert(X,[Y|T],[X,Y|T]):¾ X=<Y. insert(X,[Y|T],[Y|T1]):¾ X>Y,insert(X,T,T1). Метод перестановок. Алгоритм сортировки списка путем перестановки элементов заключается в следующем: для того, чтобы упорядочить непустой список 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).
Стандартные предикаты языка Пролог.
Арифметические предикаты.
Пролог рассчитан, главным образом, на обработку символьной информации, при этом потребность в арифметических вычислениях относительно мала. Поэтому и средства для таких вычислений весьма просты. Для выполнения основных арифметических действий можно воспользоваться несколькими предопределенными операторами: 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
6.3. Предикаты определения типов термов. Программист может предотвратить ошибки Пролога, проверив тип аргумента предиката с помощью следующих встроенных в Пролог-систему предикатов: 1) integer(X)истинно, если X—целое число; 2) float(X)истинно, если X—вещественное число; 3) number(X)истинно, если X— целое или вещественное число; 4) atom(X)истинно, если X—атом; 5) atomic(X)истинно, если X—атом или число; 6) compound(X)истинно, если X—составной атом (структура); 7) novar(X)истинно, если X—константа; 8) var(X)истинно, если X—переменная. 9) string(X)истинно, если X—строка.
|
||
Последнее изменение этой страницы: 2018-04-12; просмотров: 454. stydopedya.ru не претендует на авторское право материалов, которые вылажены, но предоставляет бесплатный доступ к ним. В случае нарушения авторского права или персональных данных напишите сюда... |