- •Методическое пособие
- •1. Структура программы и синтаксис языка пролог
- •Структура программы на языке Пролог
- •2. Лабораторная работа №1. «вычисление целей. Откат»
- •Задания на лабораторную работу №1
- •3. Лабораторная работа №2. «рекурсия. Работа со списками».
- •3.1 Использование рекурсии
- •3.2 Списки
- •3.3. Использование структур в Прологе
- •3.4 Задания на лабораторную работу №2
- •4. Лабораторная работа № 3. «применение пролога для решения интеллектуальных задач»
- •4.1 Организация поиска в глубину
- •4.2 Организация повторения с использованием предиката fail
- •4.3 Задания на лабораторную работу №3
- •5. Лабораторная работа №4. «проектирование простейшей экономической советующей системы».
- •Список рекомендованной литературы
Задания на лабораторную работу №1
В данной работе необходимо составить две программы на Прологе для решения следующих задач.
Задача 1.Студент задает ряд фактов о родительских отношениях в некоторой семье (семьях). Например:parent(Victor,Vera) утверждает, что “Victor” является родителем для “Vera”. Эти факты должны сопровождаться указанием пола (м; ж) участников отношения. В правилах задаются условия, позволяющие установить отношения «бабушка», «дедушка», «брат», «сестра». Задача должна уметь отвечать на вопросы о родственных отношениях между членами семьи, как то: кто кому приходится «дедушкой» или «братом» или является ли X сестрой Y и т. п.
Задача 2.В программе задается ряд фактов о званиях военнослужащих некоторой воинской части, например zvan(Ivanov,serjant), а также о воинской субординации (о цепочке воинских званий и соответствующего ей отношения «командир-подчиненный»), например: рядовой, ефрейтор, старшина, сержант, мл. лейтенант и т.д.
Задача должна уметь отвечать на вопросы, кто и кому подчиняется по службе, подчиняется ли X другому индивиду Y, и т.д.
Кроме того, если ввести ограничения на службу в воинской части в зависимости от звания и возраста, например ogr(major,45) и добавить сведения о возрасте военнослужащих, задача должна выдавать список военнослужащих, подлежащих увольнению.
3. Лабораторная работа №2. «рекурсия. Работа со списками».
Целью работы является получение практических навыков в применении рекурсии и работе со списковыми структурами на сравнительно несложных примерах.
3.1 Использование рекурсии
В прологе нет операторов do, if, которые присущи алгоритмическим языкам. Поэтому для осуществления циклов используется рекурсия.
предикат1:-
предикат2,
предикат3,
предикат1.
Это правило будет рекурсивно вызывать себя.
Пример.Напечатать цифры отN1 доN2.
domains
numbers=integer
predicates
print_ numbers(numbers, numbers)
clauses
print_ numbers(N,N):-
write(N),nl.
print_ numbers(X,N):-
X<N,
write(X),nl,
X1=X+1,
print_ numbers(X1,N).
goal
print_numbers(1,5)
Пример.Вычисление факториала.
domains
number,produkt= integer /*real*/
predicates
factorial(number,product)
clauses
/*правила для вычисления факториала*/
factorial(1,1).
factorial(N,X1):-
N1=N-1,
factorial(N1,X),
X1=N*X.
goal
factorial(3,X1), write(X1).
3.2 Списки
Пролог поддерживает такую важную структуру данных как список. В Прологе нет массивов, и можно сказать, что списки играют ту же роль, что и массивы в алгоритмических языках. Списки следует использовать, если нам, например, надо обработать некоторую последовательность чисел [2,7,8,1]. Перед использованием списков надо объявить такой тип данных в разделе domains. Например:
Domains
List1=integer*
List2=char*
List3=symbol*
Списки обрабатываются последовательно, начиная с первого элемента (головы) списка. Для этого используется следующее представление
[2.7.8.1]=[ X|TailOfList]
Голова=2
Tail Of List=[7,8,1]
Для объявления принадлежности списку используется предикат belong(element,list), который истинен, еслиelementпринадлежит спискуlist.
domains
list1=integer*
predicates
belong(integer,list)
clauses
belong(X,[X|Tail]).
belong(X,[Y|Tail]):-
belong(X,Tail).
Для выделения элемента из списка применяется метод разделения на голову и хвост. Стратегия поиска состоит в рекурсивном выделении головы списка и сравнении ее с элементом поиска. Первый вариант правила предполагает наличие соответствия между объектом поиска и головой поиска. Хвост списка, при этом присваивается анонимной переменной. Если объект поиска и голова списка, действительно, соответствуют друг другу, то результатом сравнения является успех, если нет, - то неуспех. Другими словами, утверждение удовлетворяется в случае совпадения объекта поиска и головы списка. Если же эти два элемента данных различны, то попытка сопоставления считается неуспешной, происходит откат и поиск другого правила или факта, с которым можно снова попытаться найти соответствие.
Для случая несовпадения объекта поиска и головы списка, следовательно, необходимо предусмотреть правило, которое выделило бы из списка следующий по порядку элемент и сделало бы его доступным для сравнения. Поскольку следующий за головой текущего списка элемент является головой текущего хвоста, можно представить этот текущий хвост как новый список, голову которого можно сравнить с объектом поиска (второй вариант правила). Если первое правило неуспешно, то происходит откат, и делается попытка со вторым вариантом belong, и т. д.
Для изучения операций над списками можно рекомендовать [1] или [2]. В настоящих методических указаниях приводятся лишь некоторые из них, связанные с добавлением и удалением элементов, которые могут быть использованы при решении ниже поставленных задач.
Конкатенация (слияние списков):
Пример. [2,3,1]+[2,4,1]=[2,3,1,2,4,1]
Введем предикат con(L1,L2,L3), который истинен только тогда, когдаL1+L2=L3. Справедливы следующие высказывания
con([],L,L).
con([N|L1],L2,[N|L3]):-
con(L1,L2,L3).
Добавление элемента в голову списка:
add_el(X,List1,List2).
a, [b,c], [a,b,c]
add_el(X,List1,[X,List1]).
Удаление элемента из списка:
del_el(X,List1,List2) СписокList2 не содержит эл-тX
del_el(X,[],[]).
del_el(X,[X|Tail1],Tail1).
del_el(X,[Y|Tail1],[Y|Tail2]):-
del_el(X,Tail1,Tail2).
Добавление элемента в конец списка:
last_el(X,List,List2):-
Y=[X].
con(List,Y,List2).