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

Задания на лабораторную работу №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).