Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
flp.doc
Скачиваний:
2
Добавлен:
01.04.2025
Размер:
207 Кб
Скачать
☆

81. Оператор присваивания в прологе

В языке Пролог типизация динамическая, поэтому существуют две операции присвоения: is — присвоение эквивалентного значения и = — присвоение образца. В таком случае:

X is 2 + 1, X = 3

X = 2 + 1, X = 3

Первая последовательность будет признана верной, вторая — ложной.

>?- X = 2+2 //не оператор присваивания, а оператор сопоставления.

X=2+2

Для того чтобы вычислить выражение:

>?- is(X,2+2)

x=4;

предикат is генерирует одно решение.

82. Детерминированные и недетерминированные предикаты

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

83. Отсечение, операционная модель Пролога в случае применения отсечения.

механизм, который позволяет, ограничить бэктреккинг в какой-либо из ветвей. Механизм отсечения запускается в случае, если в программе в качестве подцели встречается предикат, который записывается как ! или cut. Предикат отсечения ограничивает перебор ветви в которой он встретился. Cut подсказывает прологу "закрепить" все решения предшествующие появлению его в предложении. Это означает, что если требуется бэктрекинг, то он приведет к неудаче (fail) без попытки поиска альтернатив.

84. Операционная семантика Пролога при использовании сечения

См. 83

85. Подцель, терпящая неудачу

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

86. Запись списка в виде структуры

в Прологе используется скобочная форма записи, в которой список записывается как последовательность элементов, разделенных запятыми, в квадратных скобках. Например, вышеуказанный список может быть записан как [a,b,c].

87. Традиционная форма записи списка

Стандартная форма записи терма в прологе является запись терма в виде структуры, состоящие из функтора и компонента. Наряду с такой формой возможна и операторная нотация, при которой главный функтор структуры объявляется в виде оператора, а компоненты являются операндами.

операторная форма используется для улучшения формы записи программы. Кроме того, в виде операторов объявлены основные стандартные предикаты пролога

Вид:

op(prior, assoc,name_func)

prior - приоритет оператора, определяет порядок выполнения операции, содержащий несколько операторов. В большинстве пролог систем принимает значение от 0 до 1200.

assoc - ассоциативность. выполняет порядок операции в выражении, содержащем операторы с разным приоритетом и вид оператора. assoc имеет следующее значение.

для префиксных: fx,fy. Для постфиксных: xfyf. Для инфиксных xfy, yfx, xfx.

x - обозначает предикат, имеющее приоритет выше приоритета оператора. y - определяет оператор приоритет которого меньше или равен приоритету оператора.

88. Рекурсивное логическое программирование

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

Реализация рекурсивного процесса.

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

89. Запись фактов, записи рекуррентных определений

Факты - это самая простая форма предикатов Пролога. Факты имеют следующий синтаксис записи: predicat(arg1, ... argN). Обычно рекурсивная программа состоит как минимум из двух частей: 1. граничного условия, при котором рекурсия останавливается; 2. рекурсивного условия, при котором в описание функции или предиката входит и сама функция или предикат.

90. Определение процедуры слияния списков

?-ap([a,b,c],[d,e,f],X).

X=[a,b,c,d,e,f].

ap([],L2,L2).

ap([X|L1],L2,[X|L3]):-ap(L1,L2,L3).

91. Определение процедуры определения длины списка

?-dlin([a,b,c],X).

X=3

dlin([],0).

dlin([X|L],R):-dlin(L,R1), R is R1+1.

92. Определение процедуры определения факториала

fac(1,1).

fac(N,Res):- N>1,N1 is N-1,fac(N1,T), Res is T*N.

93. Определение процедуры четного и нечетного списка

>(even '(a b c d))

t

>(number '(a b c d))

nil

>(defun even(list)(

(cond

((null list) T);

(t (num (cdr list))

)

))

>(defun num (list)

(cond

((null list) nil)

(t (even (cdr list))

))

null - функция, проверяющая список на пустоту

94. Нелогические предикаты

Нелогические предикаты являются детерменированными. Предикаты этой группы можно разделить на 2 части: предикаты обеспечивающие доступ к текущей программе и её обработку. Предикаты, обеспечивающие ввод-вывод. 95. Организация ввода/вывода в прологе

Предикаты ввода/вывода из текущего потока

write(F)

read(F)

96. Предикат открытия и чтения текущего входного потока

Предикат read(X) читает очередной терм из текущего входного потока и сопоставляет его с X. Предикат see(X) открывает файл X, если он еще не открыт, и файл X становится текущим входным потоком данных.

97. Предикат открытия и записи текущего выходного потока

Предикат tell(X) открывает файл X, если он еще не открыт, и файл X становится текущим выходным потоком данных Предикат write(X) записывает терм X в текущий выходной поток. 

98. Перемещение терма во внешнюю память базы данных

put(X),get(X),get0(X).

?-put(65).

A

get0(X) считывает символ, пропуская все непечатыемые символы.

get(X) просто связывает.

99. Организация работы с динамической базой данных

Для работы с такой БД, ее предикаты необходимо описать в разделе database

Предикат findall позволяет собрать все имеющиеся в базе данные в список, который может быть полезен при дальнейшей работе

100. Предикат assert для перемещения фактов и правил

assert(F) %добавляет к множеству фраз программы, фразу F, как первую фразу программы

Предикат asserta заносит новый факт в базу данных, рас­полагающуюся в оперативной памяти компьютера (резидентная БД). Новый факт помещается перед всеми уже внесенными утверж­дениями данного предиката. Этот предикат имеет такой синтак­сис:

101. Constraint программирование: наложение ограничений и виды ограничений

Логическое программирование в ограничениях - подход к формулировке и решению задач, которые могут быть естественным образом представлены в терминах ограничений, заданных во множестве переменных. Традиционная прологовская стратегия лежит в фразе: «образовать и проверить». Constraint программирование сначало накладывает ограничение, а потом происходит генерация.

102. Классификация Constraint систем логического программирования

Например, CLP(B) означает возможность решать уравнения с булевыми переменными. CLP(Q) - уравнения в рациональных числах, а CLP(R) - в вещественных. Причем последние могут решаться приближенно CLP(Rfloat), а могут с применением интервальной арифметики CLP(Rint). Но наиболее популярны решатели задач на конечных доменах CLP(FD), то есть на конечных множествах целых чисел. 

103. Стандартные предикаты Constraint систем программирования

Обычные знаки арифметических отношений, которые имеют префикс #, указывают на их особый статус. Арифметические ограничения можно комбинировать с помощью  логических связок (#\, #/\, #\/, #=> и #<=>).

предикат indomain(X), который возвращает все значения из области определения ограниченной переменной. indomain может выдать очень много значений

104. Множественные предикаты. Описание компонентов

"множественные" предикаты findall, bagof и setof.

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

Предикат bagof(Object,Goal,List) порождает список List всех объектов Object, отвечающих цели Goal

Предикат setof(Object,Goal,List) отличается от предыдущего предиката в следующем:

•  список List будет упорядочен;

•  из всех повторяющихся элементов в список войдет только один

Предикат findall(Object,Goal,List) отличается от bagof тем, что он не обращает внимание на различные конкретизации тех переменных из Goal, которых нет в Object.

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