courses:knowledge_base_and_expert_system:lab3

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
Next revision Both sides next revision
courses:knowledge_base_and_expert_system:lab3 [2019/08/28 10:02]
andrey.suchkov [Цель работы]
courses:knowledge_base_and_expert_system:lab3 [2019/10/03 22:58]
andrey.suchkov [Цель работы]
Line 1: Line 1:
-====== Лабораторная работа №3: Рекурсивные структуры данных. Списки ======+====== Лабораторная работа №3: Рекурсивные структуры данных ​писки======
 ===== Цель работы ===== ===== Цель работы =====
 +Изучение и исследование рекурсивных структур данных в языке Visual Prolog на примере списков.
 ===== Основные теоретические положения ===== ===== Основные теоретические положения =====
 +Пролог позволяет определить и использовать рекурсивные типы данных. Примерами рекурсивных типов данных служат списки и деревья. Список -- это объект данных,​ содержащий конечное число других объектов (элементов списка). Список,​ содержащий числа 1, 2 и 3, записывается следующим образом:​ ''​[1,​ 2, 3]''​.
 +
 +Для объявления списка используется следующее описание домена:​
 +<code prolog>
 +domains
 +integerlist=integer*
 +</​code>​
 +Список является рекурсивным составным объектом,​ он состоит из двух частей:​
 +  * головы списка -- первого элемента списка;​
 +  * хвоста списка -- списка,​ включающего все последующие элементы.
 +Пусть имеется список ''​[1|[2,​ 3]]''​. Тогда головой списка будет элемент ''​1'',​ а хвостом ''​[2,​ 3]''​.
 +
 +Так как список имеет рекурсивную составную структуру,​ для работы со списками используется рекурсия.
 +
 +//​Пример 1.// Вывод элементов списка.
 +<code prolog>
 +domains
 +integerlist=integer*
 +predicates
 +printlist (integerlist)
 +clauses
 +printlist ([]):- !.  % Для пустого списка ничего не делать
 +printlist ([H|T]):- write (H), nl, printlist (T).  % Для непустого списка ​
 +                                                   % отделить голову,​
 +                                                   % вывести ее,
 +                                                   % продолжить вывод для
 +                                                   % хвоста списка
 +</​code>​
 +
 +//​Пример 2.// Необходимо преобразовать список,​ элементами которого являются целые числа, инвертируя знак элементов списка,​ то есть положительные числа преобразовать в отрицательные,​ отрицательные в положительные,​ для нулевых значений никаких действий не предпринимать.
 +
 +Придется рассмотреть два случая -- для непустого и пустого списков. Преобразование пустого списка дать в результате также пустой список. Если же список не пуст, то следует рекурсивно выполнять отделение головы списка,​ ее обработку и рассматривать полученный результат как голову списка-результата.
 +<code prolog>
 +domains
 +intlist=integer*
 +predicates
 +inverting (intlist, intlist)
 +processing (integer, integer)
 +clauses
 +% обработка пустого списка дает, в результате,​ тоже пустой список
 +inverting ([ ], [ ]):- !.
 +% если список непустой,​ отделить голову,​ обработать ее,
 +% и добавить в качестве головы списка-результата
 +inverting ([H | T], [Inv_H | Inv_T]):​- ​
 +processing (H, Inv_H), inverting (T, Inv_T).
 +% предикат processing выполняет действия по обработке элемента списка в
 +% зависимости от его знака, предикат имеет два предложения, ​
 +% так как нужно рассмотреть два варианта:​ ненулевое и нулевое значения
 +processing (0, 0):- !.
 +processing (H, Inv_H):- Inv_H=-H.
 +goal
 +inverting ([-2, -1, 0, 1, 2], Inv_List), write("​Inv_List=",​ Inv_List).
 +</​code>​
 +Результат работы программы:​
 +<code prolog>
 +Inv_List=[2,​ 1, 0, -1, -2]
 +</​code>​
 ===== Постановка задачи ===== ===== Постановка задачи =====
 +Реализовать на языке Visual Prolog программу,​ выполняющую заданные операции над списками в соответствии с индивидуальным вариантом задания.
 ===== Порядок выполнения работы ===== ===== Порядок выполнения работы =====
 +  - Напишите на языке Visual Prolog программу,​ реализующую заданные операции над списками в соответствии с индивидуальным вариантом задания.
 +  - Произведите отладку программы в системе Visual Prolog для запросов на решение прямой и обратной задачи и задачи на перебор вариантов.
 +  - Постройте трассу программы при выполнении каждого запроса.
 ===== Варианты заданий ===== ===== Варианты заданий =====
 +[[.:​lab3:​lab3_vars]]
 ===== Содержание отчёта ===== ===== Содержание отчёта =====
 +  * Цель работы. 
 +  * Краткое изложение основных теоретических понятий. 
 +  * Постановка задачи с кратким описанием порядка выполнения работы. 
 +  * Трассы выполнения запросов и объяснение результатов их выполнения. 
 +  * Общий вывод по проделанной работе. 
 +  * Код программы.
courses/knowledge_base_and_expert_system/lab3.txt · Last modified: 2022/12/10 09:08 (external edit)