Есть функция для роверки логического следования методом резолюции для 2х диъюнктов
unions :: [String] -> [String] -> [String]
unions [] x = x
unions x y
|(not (elem (head x) y)) && (not (conflict (head x) y)) = (head x) : unions (tail x) y
|elem (head x) y = unions (tail x) y
|conflict (head x) y = unions (tail x) (delete (contr (head x)) y)
|otherwise = unions (tail x) y
Нужно написать функцию для неё формирования списков списка, аналогично как в прологе
combinations([ ], [ ]).
combinations( L, [X | Р] )
:- del( X, L, L1), combinations( L1, Р).
unions([X|Xs], Y, [X|L])
:- not(prin(X, Y)), not(conflict(X, Y)), unions(Xs, Y, L).
unions([X|Xs], Y, L)
:- prin(X, Y), unions(Xs, Y, L).
unions([X|Xs], Y, L)
:- conflict(X, Y), del($X, Y, R), unions(Xs, R, L).
unions([$X|Xs], Y, [$X|L])
:- not(prin($X, Y)), not(conflict($X, Y)), unions(Xs, Y, L).
unions([$X|Xs], Y, L)
:- prin($X, Y), unions(Xs, Y, L).
unions([$X|Xs], Y, L)
:- conflict($X, Y), del(X, Y, R), unions(Xs, R, L).
go(X) :- combinations(X, L), startcheck(L).
Помогиет кто шарит, с меня причитается) :boast: