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

5.1.Метод отката после неудачи – опн

Использование предиката fail

Листинг 5.1.Программа, использующая ОПН

domains

name=symbol

predicates

country(name)

print_countries

clauses

country(england).

country(france).

country(germany).

country(denmark).

print_countries:-

country(X),

write(X),

nl,

fail.

print_countries.

Пояснения к программе:

Поставим перед программой две разные цели:

1)country(X);

2)print_countries.

Как поведет себя каждая из этих целей, если мы сделаем ее сначала внешней, а потом внутренней?

Внешняя цель

Для country(X) c fail и без fail внешняя цель даст одинаковый ответ – все 4 решения. Fail для внешней цели в этом случае просто избыточна, потому что внешняя цель заставит ее получить все ответы и без fail.

Для print_countries внешняя цель без fail даст одно решение- england- , потому что откат для получения других решений просто некуда выполнить. В разделе clauses нет больше предиката с таким именем (print_countries). Без fail у нас нет повода обратиться к country , даже если цель внешняя.

Для print_countries внешняя цель с fail даст все 4 решения. Print_countries использует поиск с возвратом с тем, чтобы получить все решения для country, заставляя Пролог выполнять поиск с возвратом через правило print_countries. При этом Пролог возвратится к той подцели в правиле, которая может дать множественные решения, то есть к недетерминированной подцели. Предикаты nl и write не могут быть согласованы повторно, так как они не в состоянии дать нам новые решения, поэтому Пролог вынужден откатиться к предыдущей подцели, то есть к country.

Внутренняя цель

Для цели country(X) с fail и без fail результат одинаков – ответ будет один. Это происходит потому, что fail стоит в правиле print_countries,а в country fail не задействован.

Для цели print_countries c fail мы получим все 4 ответа, а без fail –один ответ.

Замечание :

Помещать подцель после fail в теле правила бесполезно, так как fail – всегда неудача, а значит, нет возможности для достижения подцели, расположенной после fail.

Вывод

Метод ОПН - откат после неудачи –позволяет управлять вычислением цели при поиске всех возможных ее решений. Для этого используется встроенный предикат fail.

  1. Суть идеи логического программирования. Хорновские дизъюнкты. Процесс решения задачи с точки зрения логики. Уравнение Ковальского.

Логическое программирование – это технология, позволяющая нам конструировать систему путем представления знаний на формальном языке ( например, Прологе), а задачу решать путем применения процессов логического вывода к этим знаниям.

  • Цель составления программы – это создание инструмента, который позволит решить задачу для некоторой прикладной области.

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

Для записи отношений между объектами можно использовать различные формализмы. В ЛП используется исчисление предикатов первого порядка (ИП1П).Вернее, ограниченная форма ИП1П в виде логики так называемых хорновских предложений(факты, правила и цели).

По сути хорновские дизъюнкты - это логические импликации(правила типа если - то) .В общем виде импликации имеют вид:

A;A;….;A:-B,B,…,B (n>=0;m>=0)

В – это посылки импликации, А – это заключение импликации.

Чтобы увеличить эффективность метода резолюций, используемого в качестве метода автоматизации доказательства теорем, берутся лишь формулы при n=1 и m>=0:

  • Формула Хорна-> A:-B,B,….,B

  • (n=1; m>0)- это правило

  • A:-

  • (m=0;n=1) - это факт

  • ?:-B,B,…..,B

  • (m>0;n=0) –это цель

Рис.2.1. Схема, демонстрирующая два уровня значения программы – декларативное и процедурное

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

  1. Метод повтора, определяемый пользователем(МП).

Правило повтора имеет вид:

repeat.

repeat:-repeat.

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

Предикат repeat будет вычисляться успешно при каждой новой попытке его вызвать после отката.Repeat используется в качестве компоненты других правил.

Листинг 5.7. Использование repeat для ввода и вывода на экран символов до тех пор пока не будет нажата клавиша ‘Enter’.(ASCII-код =13)

predicates

repeat

typewriter

clauses

repeat.

repeat:-

repeat.

typewriter:-

repeat,

write(“ input char”),nl,

readchar(Ch),

write(Ch),nl,

char_int(Ch,13),

write(“end”).

goal:typewriter,nl.

Встроенный предикат readсhar(Ch) читает новое значение, вводимое с клавиатуры только при первом вызове предиката и не делает этого при возврате (то есть если использовать здесь предикат fail, то повтора чтения не произойдет):

typewriter:-

readchar(Ch),

write(Ch),

fail.

Встроенный предикат repeat позволяет преодолеть эту трудность. Однако даже repeat при наличии fail не приведет к завершению программы, потому что комбинация repeat…..fail приводит к бесконечному циклу:

typewriter:-

repeat,

readchar(Ch),

write(ch),

fail.

Как выйти из комбинации repeat…fail? Очевидно, необходимо ввести индикатор завершения программы и заменить им предикат fail. Таким индикатором в нашей ситуации является нажатие на клавишу ‘Enter’.Для этого можно использовать стандартный предикат char_int(CharParam,IntParam), который успешен, если код символа CharParam совпадает со значением IntParam.

Листинг 5.8.Использование метода повтора для ввода двух новых чисел и получения их суммы.

predicates

sum(integer,integer,integer)

repeat

summa

check(integer,integer)

write_message

goal

clearwindow,

write_message,

summa.

clauses

repeat.

repeat:-

repeat.

write_message:-

nl,write(”input 2 integer number”),nl,

write(“for stop input 0 for X or Y”),nl,nl.

summa:-

repeat,

write(“input X=”),

readint(X),nl,

write(“input Y=”),

readint(Y),nl,

write(“X=”,X,” Y=”,Y),nl,

check(X,Y),!.

check(X,0):-

nl,write(“OK”).

check(Y,0):-

nl,write(“OK”).

check(X,Y):-

sum(X,Y,Z),

write(“ Z=”,Z),nl,

write(“input new integer”),nl,

write(“ numbers for X and for Y”),nl,

fail.

sum(X,Y,Z:-

Z=X+Y.

В данной программе для останова процесса сложения вместо одного из двух чисел(или вместо и того и другого) вводится 0.

Следует помнить, что:

-предикаты read и write читают и печатают свои значения только при первом вызове, поэтому fail здесь не поможет, а repeat будет на месте;

- правило repeat дает бесконечные циклы, поэтому нужен признак конца;

- все переменные теряют свои значения при откате обработки в позицию, предшествующую тем вызовам предиката, который эти значения устанавливал.

Замечания.

  • Если необходимо бесконечное выполнение, и окончание наступает только при возникновении каких- то исключительных ситуаций, то в не интерактивных программах можно использовать предикат exit, прекращающий выполнение программы. В интерактивных программах можно нажать клавишу <Break>.

  • Так как ни write(), ни readchar() не являются альтернативными, то возврат происходит к repeat,который всегда имеет альтернативные решения.

  • Обратите внимание на то, что Ch теряет свое значение после отката в позицию перед вызовом предиката readchar(Ch), который связывает переменную Ch.Такой тип освобождения переменной важен, когда поиск с возвратом применяется для определения альтернативных решений, но он не эффективен при использовании поиска с возвратом в других целях. Суть в том, что хотя поиск с возвратом и может повторять операции сколько угодно раз, но он не способен “запомнить” что-либо из одного повторения для другого. Поэтому write() надо сделать перед повтором, так как вы теряете при откате значение переменной.

  • Правило repeat позволяет получить бесконечные откаты. В МП откат может быть выполнен всегда в отличии от метода ОО, где откат выполняется только после искусственно созданного неуспешного результата. Но не следует забывать о необходимости введения признака завершения повторов.

  1. Классификация объектов данных в Прологе. Структура программы на Прологе.

domains

/*объявление доменов*/

predicates

/*объявление предикатов*/

clauses

/*предложения-факты и правила*/

goal

/*цель программы*/

Раздел доменов (domain)

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

domains

title, author=symbol

year=integer

predicates

book(title, author, year)

Объявление собственных доменов позволяет отследить ошибки. Несмотря на то, что author и title интерпретируются типом symbol ,они не эквивалентны друг другу.

Если вы перепутали местами объекты, то это будет сразу обнаружено.

Интерпретация (задание типов аргументов) при декларации предикатов может происходить напрямую (без их описания в разделе domains),но только в случае, если эти домены – стандартные (смотри таблицу стандартных доменов).

Раздел предикатов ( predicates)

Если в разделе clauses вы описали собственные не cтандартные предикаты, то их необходимо объявить в разделе predicates(иначе Пролог вас не поймет).

В результате объявления предиката вы сообщаете, к каким доменам принадлежат аргументы этого предиката. Только стандартные предикаты объявлять не обязательно.

Все пользовательские предикаты c указанием доменов(типов) их аргументов в этом разделе просто перечисляются.

predicates

summa(integer, integer, integer)

Декларация предиката не завершается точкой.

Имя предиката начинается с буквы, за которой может следовать буква, цифра или знак подчеркивания.

Раздел предложений (сlauses)

Раздел состоит из фактов и правил.

Факты(facts) устанавливают отношения между объектами или описывают свойства объекта:

student(petrov, sp-81,2010).

cup(red).

parent(bob, tom).

Правила(rules)- определяют, когда эти отношения истинны. Правила позволяют выводить одни факты из других.

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

If тело then голова ( голова if тело)

Раздел целей (goal)

запускает программу в работу.

Выводы:

  • Программа состоит из предложений, определяющих отношения между объектами.

  • Предложения бывают трех типов: факты, правила и цели.

  • Факты содержат утверждения, которые всегда истинны. Правила содержат утверждения, истинность которых зависит от выполнения некоторых условий. Правила состоят из головы и тела. Тело поставляет новые подцели, которые требуется доказать.

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

  • Последовательность предложений, описывающих предикат, называется процедурой.

  • Вычисление ЛП – это вывод следствия из программы. В математике такие системы называются дедуктивными.(ДС)

  1. Метод отсечения и отката(ОО)

Использование предиката cut

В случае, когда надо иметь доступ только к определенной части данных, Пролог использует встроенный предикат cut (!)-отсечение.

Его вычисление всегда успешно. Этот предикат заставляет внутренние унификационные подпрограммы убрать все указатели отката, установленные во время попытки вычислить текущую подцель – то есть он прерывает поиск с возвратом. Через cut невозможно вернуться (совершить откат). Отсечение обычно помещается в теле правила.

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

  1. Свойства непротиворечивости, полноты и разрешимости в отношении ИП1П.

ИП1П - Исчисление предикатов первого порядка. Полная теория (Теорема Геделя о полноте исчисления). 

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

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

Теорема о неполноте Геделя

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

 

ИП1П - неразрешимо (Теорема Черча): 

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

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

  1. Правильно построенные формулы(ППФ)

  2. Основные компоненты языка логики первого порядка

  3. Работа со списками. Операции над структурами типа список.

Операции над структурами данных типа список.

1 Принадлежность списку

2 Определение длины списка.

3 Вывод списка на печать

4 Модификация списка

5 Деление списка(X,L,L1,L2)

6 Удаление элемента из списка (X,L1,L2)

7 Объединение списков(L1,L2,L3)

8 Cортировка списков

  1. Правила сопоставления структур. Где и когда используется сопоставление?

  2. Переменные и кванторы. Что дает нам использование кванторов в ИП1П?

  3. Алгоритм унификации – основа вычислительной модели ЛП. Для чего осуществляется проверка вхождения?

  4. Объединение списков. Предикат append. Докажите обратимость утверждения append.Какие еще особенности ЛП , кроме обратимости , Вы можете указать?

Определим предикат append с тремя аргументами

append(List1,List2,List3)

List1, List2 – исходные списки,

List3- список, получающийся при их объединении.

Например, append([1,2],[3,4],[1,2,3,4])-true

append([1,2],[3,4],[1,2,1,3,4])-false

Определим отношение append,как содержащее два случая в зависимости от вида List1:

1. Если List1-пуст, то второй и третий аргументы представляют собой один и тот же список (назовем его List2):

append([],List2,List2).

2. Если List1 –не пуст, то он имеет голову и хвост [H|L1], и можно объединить List1 и List2 для формирования List3,сделав голову List1 головой List3.

Хвост List3 состоит из объединения остатка List1 и всего List2:

append(H|L1],List2,[H|L3]:-

append(L1,List2,L3).

Листинг 6.1.4. Программа объединения списков

domains

list=integer*

predicates

append(list,list,list)

clauses

append([],List,List).

append([H|L1],List2,[H|L3]):-

append(L1,List2,L3).

Поставьте цели:

1.?append([1,2],[3,4,5],L).

Ответ:L=[1,2,3,4,5] 1Solution

2.?append([1,2],[3],L),append(L,L,LL).

Ответ: L=[1,2,3]

LL=[1,2,3,1,2,3] 1Solution

3.?append([1,2],L,[1,2,5,6]) –разность между списками

Ответ:L=[5,6] 1Solution

4.? append(L,[5,6],[1,2,5,6] –разность между списками

Ответ L=[1,2] 1Solution

Замечание для 3 и 4:

Первые два аргумента отношения append не симметричны, поэтому имеется два различных варианта нахождения разности между двумя списками.

Рассматривая append с декларативной точки зрения мы определяем отношение между тремя списками. Это отношение сохранится даже если List1 и List3 известны, а List2 –нет. Оно также справедливо, если известен только List3.

Таким образом, предикат append определяет отношение между входным набором и выходным набором таким образом, что отношение применимо в обоих направлениях Задавая отношения вы можете спросить систему

–Какой выход соответствует данному входу?

-Какой вход соответствует данному выходу?

Состояние аргументов при вызове предиката называется потоком параметров. Аргумент, который присваивается или назначается в момент вызова, называется входным аргументом и обозначается буквой”i”; а свободный аргумент – это выходной аргумент, и он обозначается буквой “o”.

У предиката append есть возможность работать с разными потоками параметров в зависимости от того, какие исходные данные ему зададут. Если утверждение Пролога может быть использовано с различными потоками параметров, оно называется обратимым утверждением. Обратимые утверждения имеют дополнительные преимущества, и их создание добавляет “мощности” предикатам.

Использование программы append в обратном направлении:

Goal: (L1,L2,[1,2,3,6]).

Ответ:

L1=[] L2=[1,2,3,6]

L1=[1] L2=[2,3,6]

L1=[1,2] L2=[3,6]

L1=[1,2,3] L2=[6]

L1=[1,2,3,6] L2=[] 5 Solutions

Если бы объекты были не числа, а дни недели,то:

domains

list=string*

Goal: append(Before,[friday|After],[monday,tuesday,wednesday,thursday,friday,saturday,sunday]).

Ответ:

Before=(“monday”,”tuesday”,’wednesday’,”thursday”]

After=[“saturday”,”sunday”]

1 solution

goal: append(L1,[b|_],[a,b,c])

ответ

L1=[“a”] 1Solution

goal: L1=[a,b,c,d,f,f,m],append(L2,[f|_],L1)

ответ:

L1=[a,b,c,d,f,f,m] L2=[a,b,c,d]

L1=[a,b,c,d,f,f,m] L2=[a,b,c,d,f]

2 solutions

(удаление всего, что стоит следом за f)

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

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

Ранее мы ввели предикат member.Такие предикаты как member, sublist, prefix могут быть определены в терминах предиката append, если последний использовать не для объединения, а для разделения(расщепления) списков.

Попробуем определить отношение принадлежности, используя конкатенацию.

member(X,L):-

append(L1,[X|L2],L).

X принадлежит L, если список L можно разбить на два списка L1 и L2 так, чтобы элемент X являлся головой списка L2. Поставим цель ? member(2,[1,3,2,5,7]). Предикат member будет просматривать список L элемент за элементом до тех пор, пока не встретит 2, или пока не кончится список. Ответ: yes –no

Листинг 6.1.5.Определение принадлежности через объединение

domains

list=integer*

predicates

member(integer,list)

append(list,list,list)

clauses

member(X,L):-

append(L1,[X|L2],L).

append([],L,L).

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

append(L1,L2,L3).

Попытайтесь самостоятельно использовать предикат append для нахождения префиксов, суффиксов, подсписков.

  1. Принцип резолюции . Приведите пример доказательства. Что означает понятие “полнота резолюции”? Теорема о полноте Геделя.

Листинг 4.1. программа, иллюстрирующая применение метода резолюции

predicates

likes(symbol,symbol)

food(symbol,symbol)

clauses

S2 likes(bill,pizza):-

food(pizza,italiano).

S3 food(pizza,italiano).

S2 и S3 –родительские предложения

В качестве S1 будет выступать цель goal: likes(bill,pizza), которая поступит на компилятор в виде отрицания.

Опровержение отрицания демонстрируется так: допущение отрицания цели ведет к противоречию.

likes(bill,pizza) подаем на вход системы резолютивного вывода. Система должна опровергнуть это отрицание при помощи других предложений программы.

Рис. 4.1. Применение принципа резолюции

Для верхнего случая : S1:A.

S2:A:-B.

S:B

Для нижнего случая : S1:A

S2:A

S: противоречие

В данном примере оказалось достаточно двух шагов вывода. Если предположить, что мы не отказываемся от предложений S2 и S3, и сами они не являются противоречивыми, то отсюда следует, что они совместно противоречат S1, то есть подтверждают отрицание S1, а следовательно, ответ –ДА.

В общем виде:

S1:(A1,..,An)

S2: Aк:-B1,..,Bm где 1<=к<=n

Некий предикат Ak из отрицания S1 совпадает с головой правила S2.В этой ситуации шаг вывода заменяет Ak в S1 на подцель из S2, и в качестве резольвенты получаем s:(A1,..,Ak-1,B1,..,Bm,Ak+1,..,An).

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

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

Поэтому так важна была первая теорема Геделя о полноте для логики первого порядка, согласно которой любое высказывание, являющееся следствием заданных аксиом, имеет конечное доказательство

Но на практике сама процедура доказательства была найдена Робинсоном только в 1965 году. Она известна как алгоритм резолюции Робинсона.

  1. Теорема Геделя о неполноте.

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

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

Это значит, что теорема Геделя о неполноте устанавливает определенные пределы.

Благодаря работам Геделя и Тьюринга известно, что на некоторые математические вопросы нельзя даже в принципе найти ответ в рамках конкретных формальных систем

Отсюда вытекает, что никогда не могут быть доказаны все теоремы математики в пределах любой конкретной формальной системы !

Это в дальнейшем и породило бесконечные споры о том, может ли машина стать умнее человека? Некоторые считают машину вполне формальной системой, а тогда на нее распространяются ограничения в силу теоремы о неполноте Геделя, а люди не имеют такого ограничения. Но так ли это в отношении людей? И т. д. Проблема сознания у человека продолжает оставаться нерешенной загадкой.

Например, сама машина Тьюринга относится к формальным системам, но она бесконечна, а компьютеры – конечны, и они могут быть описаны как системы в пропозициональной логике, на которую не распространяется теорема Геделя о неполноте! Кроме того, если даже предположить, что компьютеры ограничены в том, что они могут доказать, нет никаких оснований считать, будто эти ограничения не распространяются на людей!

Ясно одно- люди должны тщательно взвешивать свои действия и проводить анализ возможных последствий исследования ИИ, так как от них зависит будущее человечества Но споры двигают науку , и прогресс в области ИИ –очевиден!

Это однако не мешает широко применять автоматическое доказательство теорем на основе метода резолюции, включая обоснования математических теорем. Этим методом были доказаны несколько математических теорем, для которых не было известно доказательство.

  1. Связь метода резолюции в ИП1П с правилом модус поненс и цепным правилом. Как они соотносятся между собой?

В логике есть два классических правила вывода, открытых очень давно. Это – модус поненс и цепное заключение.

1.Modus Ponens -правило сокращения посылки путем применения импликации (отношение если….то) Если истинно А и истинно А--à(влечет)В, то можно вывести В(но не наоборот). То есть из двух данных предложений можно вывести третье(B).Корректность правила очевидна. Она получается из определения операции ВЛЕЧЕТ. Правило применимо к любой формуле.

( A

A-àB

B)

(“А влечет В” или “если А ,то В”) Рассуждения уместны только в одном направлении: зная А можно получить В, но не наоборот).Утверждение “если А, то В” будет правильным независимо от того, истинно В или ложно.

2.Цепное правило – позволяет вывести новую импликацию из двух данных импликаций.

Если истинно А-àВ и истинно В-àС, то можно вывести А-àС.Корректность очевидна: если истинность А влечет истинность В, и истинность В влечет истинность С, то истинность А влечет истинность С.

Из А àВ

В àС

Получаем АàС

Проблема доказательства в логике состоит в нахождении доказательства заключения на основании посылок.

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

2.Цепное правило – позволяет вывести новую импликацию из двух данных импликаций.

Если истинно АВ и истинно ВС, то можно вывести АС.Корректность очевидна: если истинность А влечет истинность В, и истинность В влечет истинность С, то истинность А влечет истинность С:

Проблема доказательства в логике состоит в нахождении доказательства заключения на основании посылок.

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

Метод резолюции в исчислении предикатов – это правило вывода новой логической формулы из двух посылок (похоже на решение системы уравнений: предполагается, что уравнение истинно при некоторых значениях неизвестных, и делаются подстановки, сохраняющие эту истинность и дающие новые уравнения).

Метод резолюции является более общим по отношению к модус поненс и цепному правилу. Модус поненс является частным случаем правила резолюции для случая ложного А.

Метод резолюции можно рассматривать как аналог цепного правила в применении к формулам, находящимся в конъюнктивной нормальной форме (КНФ-CNF). (Любое выражение в ИП1П можно привести к КНФ - по сути похоже на упрощение алгебраических выражений).

Если множество выражений S1 – невыполнимо, то для него существует конечная процедура вывода пустого выражения с помощью правила резолюции

Резолюция – это метод доказательства того, что ложное высказывание – ложно, а не того, что истинное высказывание - истинно. Необходимо понимать, что такое логическое следствие и логический вывод.

Предложения программы сами по себе не являются true или false .Значения true или false для предложения определяются их конкретной интерпретацией.

Определенная область интерпретации (предметная область) представляет собой произвольное множество объектов (D). Эти объекты сопоставляются именам, входящим в предложения программы(S1).

  1. Преимущества и недостатки метода резолюции

1. Надо знать и помнить всего одно правило.

2. Применение этого правила можно автоматизировать(запрограммировать на ПК).

3.Ответы можно извлекать из унификаторов.

Недостатки:

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

Общий вывод:

1. Предложения Пролога можно интерпретировать как предложения исчисления предикатов первого порядка.

(фразы Хорна)

2. Компилятор Пролога можно рассматривать как резолюционную процедуру доказательства, использующую поиск в глубину (сверху - вниз и слева – направо)

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

(неразрешимыми считаем те задачи, которые не имеют опровержения)

Дополнительная информация:

Резолюция обладает важными свойствами корректности и полноты.

Резолюция корректна в том смысле, что если с ее помощью из множества допущений S1 и отрицания F выводится противоречие, то обязательно справедливо отношение S1 |-- F.

Резолюция полна в том смысле, что если справедливо S1|-F,то противоречие непременно выводится из S1 и F.

Проблема общезначимости

Логика первого порядка только частично разрешима. Но есть алгоритмы, которые всегда устанавливают справедливость отношения S1|- F,если оно действительно имеет место. Это значит, что если составили неразрешимую логическую программу, то есть не имеющую опровержения и подали ее на вход частично разрешимой процедуры, основанной на резолюции и реализовали на ЭВМ, то может произойти зацикливание.

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

  1. Два способа реализации циклических частей программы. Управление перебором с возвратами. Рекурсивные программы. Правила задания хвостовой рекурсии.

Два способа реализации цикла: 

  1. Повторение использует откат: 

Repetive_rule:- 

<факты и правила> 

Fail. 

  1. Рекурсии использует самовызов: 

Recursive_rule:- 

<факты и правила> 

Reclusive_rule.

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

Иногда наоборот необходимо найти не одно решение, а много (несколько) решений.

Управление поиском решения можно рассматривать с процедурной точки зрения.

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

Используя откат или рекурсию при решении задачи, можно получить один и тот же результат, хотя алгоритмы их выполнения различны. Конкретная ситуация диктует тот или иной выбор реализации циклических частей программы.

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

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

Основные правила поиска с возвратом:

  1. подцели проверяются по порядку – сверху вниз

  2. предложения проверяются в том порядке, в котором они появляются в программе

  3. если подцель сопоставляется с заголовком правила, то тело правила поставляет новые подцели, которые должны быть доказаны

  4. цель доказана, когда соответствующие факты найдены для каждой листьевой вершины дерева целей.

Вызов, который дает множество решений –недетерминированный

Вызов, дающий одно и только одно решение –детерминированный.

Другим способом реализации циклических частей программы является использование рекурсии(смотри рис.5.1.)Понятие рекурсии введено в разделе “Основы логического программирования” и использовалось в решении задачи о родственных отношениях. Ее особенность заключается в том, что вычисленные с помощью рекурсии значения передаются из одного вызова в другой как аргументы рекурсивно вызываемого предиката.

Там же были даны определения рекурсии и рекурсивности.

Когда и где применяется рекурсия?

Рекурсия применяется:

-Для решения задач, содержащих в себе подзадачи такого же типа (поиск в дереве, рекурсивная обработка (например, сортировка списков);

-работа с базами данных (БД);

-обработка файлов;

-встречаются задачи, не имеющие нерекурсивного алгоритма решения;

- в математических вычислениях.

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

Однако, существует класс рекурсивных программ, которые выполняются с использованием постоянного объема памяти. Это такие рекурсивные программы, которые могут быть преобразованы непосредственно в итерационные программы. Метод реализации таких программ называется оптимизацией хвостовой рекурсии (tail recursion optimization) (оптимизацией последнего обращения). Основная идея метода: рекурсивная программа выполняется так, как если бы она была итерационной. Когда процедура может вызвать себя без сохранения информации о своем состоянии? Это возможно в том случае, если процедура не генерирует указателей отката и последней подцелью ее является рекурсивный вызов самой себя. В этом случае информация о состоянии процедуры больше не понадобится. Получается, что когда процедура на последнем шаге вызывает саму себя, то стек для вызывающей процедуры должен быть заменен на стек для вызванной процедуры. То есть происходит при замене стека очень простая операция – аргументам процедуры присваиваются новые значения, после чего выполнение процесса возвращается на начало процедуры. Поэтому с процедурной точки зрения происходящее очень похоже на итерацию (обновление управляющих переменных в цикле).

На Прологе можно задать хвостовую рекурсию следующим образом:

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

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

Замечание: В общем случае невозможно определить, является ли подобное отсечение зеленым или красным, поэтому надо предварительно тщательно исследовать этот вопрос.

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

Замечание:

-рекурсия логически проще метода итерации;

-при работе с рекурсивными правилами обязательны условия выхода из рекурсии, иначе рекурсия будет бесконечной и правила бесполезными. Ответственность за выход из рекурсии лежит на программисте. Это рассмотрено в задаче о дереве родственных отношений.