Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Київський Національний Університет Технологій і Дизайну
Лабораторна робота №3
Тема: Цикл та рекурсія
Виконала:
ст. гр. БІТ-309
Лесько А.М.
Перевірив:
доц. Демківський О.Б.
Київ 2013
Завдання
1. Реалізувати наведені в прикладах (приклад 3.1 приклад 3.6) програми в Visual Prolog 5.2.
2. Використовуючи отримані навички, згідно варіанта, написати програму на мові Пролог, що
реалізує розрахунки по формулі, наведеній в таблиці 3.1. Номер варіанта визначається
порядковим номером студента в журналі викладача.
predicates
arithm_progr (unsigned, long)
arithm_progr_aux (unsigned, long, unsigned, long)
suma_arithm_progr (unsigned, unsigned, unsigned, long)
suma_arithm_progr_aux (unsigned, unsigned, unsigned, long, unsigned, long)
clauses
arithm_progr (K, FactK):-
arithm_progr_aux (K, FactK, 1,1).
arithm_progr_aux (K, FactK, P, S):-
P <= K,
!,
NewS = S * (2*P + sin(P)),
NewP = P +1,
arithm_progr_aux (K, FactK, NewP, NewS).
arithm_progr_aux (K, FactK, P, S):-
FactK = S.
suma_arithm_progr (K, D, A1, SumaK):-
suma_arithm_progr_aux (K, D, A1, SumaK, 2,A1).
suma_arithm_progr_aux (K, D , A1, SumaK, P, S):-
P <= K,
!,
NewS = S + (A1 + (P-1) * D),
NewP = P +1,
suma_arithm_progr_aux (K, D, A1, SumaK, NewP, NewS).
suma_arithm_progr_aux (K, D, A1, SumaN, P, S):-
SumaK = S.
goal
/*
X = 5,
arithm_progr (X, FactX).
*/
K = 15,
D=4,
A1=3,
suma_arithm_progr(K, D, A1, SumaK).
Завдання 1.
X=5, FactX=5610
1 Solution
Завдання 2.
K=15, D=4, A1=3, SumaK=456
1 Solution
Висновок: В даній роботі ми ознайомились з процесом повторення: циклами та рекурсивними процедурами.
Visual Prolog не має конструкцій For, While, Repeat. Не існує прямого способу вираження повтору. Пролог забезпечує тільки два види повторень відкат, за допомогою якого здійснюється пошук багатьох рішень в одному запиті, і рекурсію, в якій процедура викликає сама себе. Visual Prolog розпізнає спеціальний випадок рекурсії, а саме хвостову рекурсію, і компілює її в оптимізовану ітераційну петлю.
Visual Prolog може виражати повторення як в процедурах, так і в структурах даних. Пролог дозволяє створювати структури даних, розмір яких не відомий під час створення.
Рекурсивна процедура це процедура, яка викликає сама себе. В рекурсивній процедурі немає проблеми з запам'ятовуванням результатів її виконання, тому що будь-які обчислені значення можна передавати з одного виклику в інший як аргументи предиката, що рекурсивно викликається.
Рекурсія має три основні переваги:
вона може виражати алгоритми, які не можна зручно виразити ніяким іншим чином;
вона логічно простіше методу ітерації;
вона широко використовується в обробці списків.
Рекурсія хороший спосіб для опису задач, що містять в собі під задачі такого ж типу. Наприклад, пошук в дереві (дерево складається з більш дрібних дерев) і рекурсивне сортування (для сортування списку, він розділяється на частини, частини сортуються і потім об'єднуються разом).
У рекурсії є один великий недолік вона «зїдає» пам'ять. Кожного разу, коли одна процедура викликає іншу, інформація про виконання викликаючої процедури повинна бути збережена для того, щоб викликаюча процедура могла після виконання викликаної процедури відновити виконання на тому ж місці, де зупинилася. Це означає, що, якщо процедура викликає себе 100 разів, то 100 різних станів повинно бути записано одночасно (стани виконання рішення зберігаються в стековому фреймі).
Інформація зберігається в області пам'яті, яка називається стековим фреймом (stack frame) або просто стеком (stack), який створюється кожного разу при виклику правила. Коли виконання правила завершується, зайнята його стековим фреймом пам'ять звільняється (якщо це не недетермінований відкат), і виконання триває в стековому фреймі правила-батька.
На мові Пролог фраза «одна процедура викликає іншу, виконуючи свій останній крок» означає:
виклик є останньою підціллю речення;
раніше в реченні не було точок повернення.
Хвостова рекурсія викликає себе без резервування нового стекового фрейму, і тому не виснажує запас пам'яті.
Ні. Замість цього потрібно створити нову змінну і надати їй потрібне значення. Наприклад:
NewP = Р + 1