ноження порожнього списку списків на деяку змінну (це необхідно, так як функція задана рекурсивно щодо другого аргументу, значить, по будь-якому настане ситуація, коли закінчаться елементи, як в підсписки, так і в головному списку).
В окремому випадку виробляємо зчеплення першого аргументу з головою другого аргументу (сформували перший результуючий елемент) з рекурсивно викликаної функцією scep для того ж першого аргументу і хвоста другого аргументу.
Наприкінці формуються всі комбінацій викликом функції perestanovka, яка рекурсивно зчіплює свою голову з рекурсивно викликаної perestanovka, яка має в якості аргументу хвіст. Комбінація порожнього списку, є порожній список списків (базовий випадок). p align="justify">. Функція contrar. Вона також як і в Prolog визначає наявності у списку контрарного атома заданому. br/>
srav xy = if (("~" + + x == y) | | ("~" + + y == x)) then True else False :: String - > [String] -> Boolx [] = False
contrar xy = if (srav x (head y) == True) then True else contrar x (tail y)
Перша функція потрібна для перевірки, чи є атоми контрарними. Принцип роботи заснований на відділенні першого символу. p align="justify"> Функція contrar складається з двох випадків. Перший є базовим, і визначає поведінку, якщо другий аргумент дорівнює пустому списку. Основний випадок аналогічний Prolog, дивимося, чи є голова контрарності Літері стосовно розглянутого, якщо ні, то рекурсивно викликаємо функцію для хвоста. p align="justify"> 4. Функція soed. Її структура буде відрізнятися від структури в Prolog тільки синтаксичної реалізацією, викликаної тим, що будь-яка функція повертає значення, яке можна далі використовувати в програмі. br/>
soed :: [String] -> [String] -> [String] [] x = xx y
| (x == []) = x
| (not (elem (head x) y)) && (not (contrar (head x) y))
= (head x): soed (tail x) y
| contrar (head x) y = soed (tail x) (delete (cont (head x)) y)
| otherwise = soed (tail x) y
Умови ті ж що і в Prolog, тільки в Haskell розглядається один випадок, так як при роботі з рядками, визначена функцію, яка повертає контрарний атом, незалежно від знаку літера.
Отже, тепер перейдемо до перевірки. Процедура prov не зупиниться при виявленні порожній резольвенти, так як у функціях мови Haskell повертається кінцеве значення, а не проводиться пошук умов, успішного завершення роботи функції. Тому необхідно переробити функцію так, щоб після кожного дзвінка soed вона перевіряла, чи результат дорівнює []. Якщо це так, то необхідно перервати виконання алгоритму. Для простоти перевірки та зручності запису, нехай функція nachprov арності 1 викличе pr з двома аргументами, головою перевіряється списку і з його хвостом: