Задача 0 (6 баллов). Слово это конечный непустой список букв фиксированного конечного алфавита. Словарь это конечный непустой список попарно различных слов. Построить логическую программу, которая для заданного словаря L разбивает множество слов L на два таких непересекающихся словаря X и Y = L \ X, что никакие два слова w1 2 X и w2 2 Y не имеют ни одной общей буквы. Запрос к программе должен иметь вид ? G(L,X, Y ). listContainsElem(Elem, [Head|Tail]) :- Head == Elem, !. listContainsElem(Elem, [Head|Tail]) :- listContainsElem(Elem, Tail). setContainsLetter(Letter, [Head|Tail]) :- listContainsElem(Letter, Head), !. setContainsLetter(Letter, [Head|Tail]) :- setContainsLetter(Letter, Tail), !. setContainsAnyOfLettersInWord([Head|Tail], Set) :- setContainsLetter(Head, Set), !. setContainsAnyOfLettersInWord([Head|Tail], Set) :- setContainsAnyOfLettersInWord(Tail, Set), !. setsContainJointLetter([Head|Tail], Set2) :- setContainsAnyOfLettersInWord(Head, Set2), !. setsContainJointLetter([Head|Tail], Set2) :- setsContainJointLetter(Tail, Set2), !. generateSubSets([], []). generateSubSets([Head|Tail], Result) :- generateSubSets(Tail, Res1), addToSets(Head, Res1, Result), !. addToSets(Elem, [], [[Elem]]). addToSets(Elem, [Head|Tail], Result) :- addToSets(Elem, Tail, Res1), append([Head], Res1, Res2), append([[Elem|Head]], Res2, Result), !. cofactor([], SubSet, []). cofactor([Head|Tail], SubSet, [Head|Result]) :- cofactor(Tail, SubSet, Result), not(listContainsElem(Head, SubSet)), !. cofactor([Head|Tail], SubSet, Result) :- cofactor(Tail, SubSet, Result), listContainsElem(Head, SubSet), !. listLength([], 0). listLength([Head|Tail], Result) :- listLength(Tail, Result1), Result is Result1 + 1. findPartsInSubsets([], [], []). findPartsInSubsets(Set, [Head|Tail], Head, HeadCofactor) :- cofactor(Set, Head, HeadCofactor), not(setsContainJointLetter(Head, HeadCofactor)), listLength(Head, Hl), listLength(HeadCofactor, Cl), Hl > 0, Cl > 0, !. findPartsInSubsets(Set, [Head|Tail], SubSet, SubSetCofactor) :- findPartsInSubsets(Set, Tail, SubSet, SubSetCofactor), !. findParts(Vocabulary, Set, Cofactor) :- generateSubSets(Vocabulary, SubSets), findPartsInSubsets(Vocabulary, SubSets, Set, Cofactor). g(L, X, Y) :- findParts(L, X, Y).