). Інакше контрарний елемент належить хвосту другого списку. p align="justify"> 5. Функція soed. Об'єднує два диз'юнктів з урахуванням контрарності
Реалізація процедури полягає в тому, що спочатку порівнюється кожен елемент першого списку з елементами другого списку, якщо елемент задовольняє поставленим умовам, то він записується результат і викликається рекурсивно soed для хвоста першого списку, другого списку і отриманого результату . Таким чином, другий аргумент є списком-константою, а всі операції виконуються над першим списком (загальний випадок). p align="justify"> Розглянемо три можливі випадки:
а) Якщо перший елемент першого списку не належить і не має контрарних атомів в другому списку, то записати його в список-результат і викликати soed рекурсивно, де перший аргумент - хвіст, другий залишається без зміни, а третій отримуємо шляхом додавання проглядається елемента.
б) Якщо перший елемент належить другому списку, то відразу ж викликати soed з тими ж параметрами, тільки в якості першого аргументу необхідно передати його хвіст.
в) Якщо в другому списку є контрарний атом, то його потрібно видалити з другого списку і викликати рекурсивно soed з хвостом першого списку, результатом видалення контрарного атома в другому списку і результатом в якості третього параметра. p>
Базовий випадок: якщо перший список порожній, а другий ні, то результатом буде другий список.
soed ([], X, X).
soed ([X | Xs], Y, [X | Z]): - not (vhodit (X, Y)), not (contrar (X, Y)), soed (Xs, Y, Z).
soed ([X | Xs], Y, Z): - vhodit (X, Y), soed (Xs, Y, Z).
soed ([X | Xs], Y, Z): - contrar (X, Y), udalit ($ X, Y, D), soed (Xs, D, Z). p>
soed ([$ X | Xs], Y, [$ X | Z]): - not (vhodit ($ X, Y)), not (contrar ($ X, Y)), soed (Xs, Y, Z).
soed ([$ X | Xs], Y, Z): - vhodit ($ X, Y), soed (Xs, Y, Z).
soed ([$ X | Xs], Y, Z): - contrar ($ X, Y), udalit (X, Y, D), soed (Xs, D, Z).
Отже, отримали всі можливі комбінації диз'юнктів і функцію об'єднання двох резольвент. Тепер необхідно знайти таку комбінацію, яка дає в результаті порожню резольвенту. Організуємо перевірку. Для того щоб почати перевірку, необхідно використовувати soed послідовно для кожного можливого варіанту з усіх комбінацій, так як в середовищі SWI-Prolog результат від функції perestanovka виходить не відразу, а по черзі, тому для реалізації перевірки логічного проходження, буде достатньо написати перевірку одного з можливих варіантів списку списків.
Спочатку потрібно вихідний список розбити на голову і хвіст, передати їх іншій функції prov арності 2, як 2 аргументи, і об'єднувати перший аргумент з другим функцією soed. Далі потрібно ви...