Задача 0 (6 баллов). Множество целых чисел называется свободным от сумм, если сумма лю- бых двух чисел из этого множества не принадлежит указанному множеству. Построить логическую программу, которая для заданного конечного множества целых чисел, представленного списком L, вы- числяет максимальное по числу элементов подмножество X, свободное от сумм. Запрос к программе должен иметь вид ? G(L;X). sumIsNotInSeq(Elem, [], Seq). sumIsNotInSeq(Elem, [Head|Tail], Seq) :- sumIsNotInSeq(Elem, Tail, Seq), Sum is (Elem+Head), not(member(Sum, Seq)). isSumSeq([], Seq). isSumSeq([Head|Tail], Seq) :- isSumSeq(Tail, Seq), sumIsNotInSeq(Head, Tail, Seq). allSubsequences([], []). allSubsequences([Head|Tail], Ans) :- allSubsequences(Tail, Seq), addElem(Seq, Head, Ans). addElem([], Elem, Ans) :- append([[Elem]], [], Ans). addElem([Head|Tail], Elem, Ans) :- addElem(Tail, Elem, Ans1), append(Head, [Elem], Ans2), append([Ans2], Ans1, Ans3), append([Head], Ans3, Ans). findSumSeqs([], []). findSumSeqs([Head|Tail], Ans) :- not(isSumSeq(Head, Head)), findSumSeqs(Tail, Ans). findSumSeqs([Head|Tail], Ans) :- isSumSeq(Head, Head), findSumSeqs(Tail, Ans1), append([Head], Ans1, Ans). sumSubsequences(Seq, Ans) :- allSubsequences(Seq, AllSeqs), findSumSeqs(AllSeqs, Ans). listLength([], 0). listLength([Head|Tail], Ans) :- listLength(Tail, Ans1), Ans is Ans1 + 1. findLongest([], []). findLongest([Head|Tail], Head) :- findLongest(Tail, Elem), listLength(Elem, El), listLength(Head, Hl), El < Hl. findLongest([Head|Tail], Elem) :- findLongest(Tail, Elem), listLength(Elem, El), listLength(Head, Hl), El >= Hl. findAnswer(List, Answer) :- sumSubsequences(List, Seqs), findLongest(Seqs, Answer). g(L, X) :- findAnswer(L, X).