кликати рекурсивно функцію prov, взявши в якості другого аргументу її хвіст і повторювати, поки там не виявиться порожньою список. br/>
nachprov ([X | Xs]): - prov (X, Xs). ([], _).
prov (X, [Y | Ys]): - soed (X, Y, Z), prov (Z, Ys).
Базовим випадком другої функції є умова, коли перший аргумент є порожня функція. Воно виходить в тому випадку, якщо буде знайдена порожня резольвента, тобто пошук закінчений з успіхом. p align="justify"> Функція pusk формує всі можливі комбінації перестановок, і перевіряє можливий варіант на наявність порожній резольвенти. Якщо така знайдена, то перевірка зупиняється і повертається результат True, інакше False програма перевіряє наступний
Реалізація алгоритму мовою Haskell
Розглянемо той же алгоритм і реалізуємо його на Haskell.
Для початку визначимо операцію логічного заперечення. Haskell функціональний мова, тому набагато легше уявити операцію логічного заперечення, як роботу з рядками, тобто, якщо є літер В«АВ», то контрарний йому літер буде утворений шляхом зчеплення двох символів ~ і A, які в результаті утворюють В«~ AВ». Для зчеплення буде користуватися стандартною операцією В«+ +В». p align="justify"> Також необхідно визначити функцію, що визначає контрарний атом. Якщо літер з запереченням, то відсікаємо голову, інакше додаємо в початок символ ~, що позначає логічне заперечення. p align="justify"> cont x
| (head x == '~') = tail x
| otherwise = "~" + + x
1. Функція perestanovka. Реалізація цієї функції відрізняється від тієї реалізації, яка була представлена ​​на Prolog. Реалізація даної функції грунтується на реверсуванні можливих хвостів і наступному зчепленні з усіма підсписків можливих списків. Щоб її організувати, необхідні три функції, кожна з яких відповідатиме за певну дію. p align="justify"> perestanovka :: Eq (a) => [a] -> [[a]]
perestanovka [] = [[]] (x: xs) = scep x (perestanovka xs) :: Eq (a) => a-> [[a]] -> [ [a]] x [[]] = [[x]] x [] = [] x (h: t) = (rev xh) + + (scep xt) :: a-> [a] -> [[a]] x [] = [] xh = [(x: h), (reverse (x: h))]
Функція rev формує дві послідовності нового списку: прямий і зворотний. Якщо преутворений список - порожній список, то результатом буде порожній список (базовий випадок). Інакше формується список, який складається з двох списків: перший сформований додаванням першого аргументу до списку, а другий, реверсированием першого списку. p align="justify"> Функція scep. Ця функція В«перемножуєВ» перший аргумент на список, в результаті якого повертається список списків. Для коректного виходу, необхідно два базових випадку:
а) умова перемноження порожнього списку на деяку змінну,
б) умова перем...