This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision | ||
courses:knowledge_base_and_expert_system:lab3 [2019/09/04 21:43] andrey.suchkov [Содержание отчёта] |
courses:knowledge_base_and_expert_system:lab3 [2022/12/10 09:08] (current) |
||
---|---|---|---|
Line 1: | Line 1: | ||
- | ====== Лабораторная работа №3: Рекурсивные структуры данных. Списки ====== | + | ====== Лабораторная работа №3: Рекурсивные структуры данных (списки) ====== |
===== Цель работы ===== | ===== Цель работы ===== | ||
+ | Изучение и исследование рекурсивных структур данных в языке Visual Prolog на примере списков. | ||
===== Основные теоретические положения ===== | ===== Основные теоретические положения ===== | ||
Пролог позволяет определить и использовать рекурсивные типы данных. Примерами рекурсивных типов данных служат списки и деревья. Список -- это объект данных, содержащий конечное число других объектов (элементов списка). Список, содержащий числа 1, 2 и 3, записывается следующим образом: ''[1, 2, 3]''. | Пролог позволяет определить и использовать рекурсивные типы данных. Примерами рекурсивных типов данных служат списки и деревья. Список -- это объект данных, содержащий конечное число других объектов (элементов списка). Список, содержащий числа 1, 2 и 3, записывается следующим образом: ''[1, 2, 3]''. | ||
Line 21: | Line 22: | ||
integerlist=integer* | integerlist=integer* | ||
predicates | predicates | ||
- | printlist (integerlist) | + | printlist(integerlist) |
clauses | clauses | ||
- | printlist ([]):- !. % Для пустого списка ничего не делать | + | printlist([]) :- !. % Для пустого списка ничего не делать |
- | printlist ([H|T]):- write (H), nl, printlist (T). % Для непустого списка | + | printlist([H|T]) :- write(H), nl, printlist(T). % Для непустого списка |
- | % отделить голову, | + | % отделить голову, |
- | % вывести ее, | + | % вывести ее, |
- | % продолжить вывод для | + | % продолжить вывод для |
- | % хвоста списка | + | % хвоста списка |
</code> | </code> | ||
Line 38: | Line 39: | ||
intlist=integer* | intlist=integer* | ||
predicates | predicates | ||
- | inverting (intlist, intlist) | + | inverting(intlist, intlist) |
- | processing (integer, integer) | + | processing(integer, integer) |
clauses | clauses | ||
% обработка пустого списка дает, в результате, тоже пустой список | % обработка пустого списка дает, в результате, тоже пустой список | ||
- | inverting ([ ], [ ]):- !. | + | inverting([ ], [ ]) :- !. |
% если список непустой, отделить голову, обработать ее, | % если список непустой, отделить голову, обработать ее, | ||
% и добавить в качестве головы списка-результата | % и добавить в качестве головы списка-результата | ||
- | inverting ([H | T], [Inv_H | Inv_T]):- | + | inverting([H | T], [Inv_H | Inv_T]):- |
- | processing (H, Inv_H), inverting (T, Inv_T). | + | processing(H, Inv_H), inverting(T, Inv_T). |
% предикат processing выполняет действия по обработке элемента списка в | % предикат processing выполняет действия по обработке элемента списка в | ||
% зависимости от его знака, предикат имеет два предложения, | % зависимости от его знака, предикат имеет два предложения, | ||
% так как нужно рассмотреть два варианта: ненулевое и нулевое значения | % так как нужно рассмотреть два варианта: ненулевое и нулевое значения | ||
- | processing (0, 0):- !. | + | processing(0, 0) :- !. |
- | processing (H, Inv_H):- Inv_H=-H. | + | processing(H, Inv_H) :- Inv_H=-H. |
goal | goal | ||
- | inverting ([-2, -1, 0, 1, 2], Inv_List), write("Inv_List=", Inv_List). | + | inverting([-2, -1, 0, 1, 2], Inv_List), write("Inv_List=", Inv_List). |
</code> | </code> | ||
Результат работы программы: | Результат работы программы: |