Аргументы М1, М2, М3 обозначают множества, которые представляются в виде списков элементов без повторений, порядок элементов в них не существенен, тип элементов - произволен.
10. subset (М1, М2): множество М1 является подмножеством М2;
11. union (М1, М2, М3): множество М3 - объединение множеств М1 и М2; вместо этого предиката может быть взят предикат intersection (М1, М2, М3): М3 - пересечение М1 и М2 или предикат substraction (М1, М2, М3): М3 - разность М1 и М2.
Исходный код:
domains
ilist=integer*
predicates
subset(ilist,ilist).
member(integer,ilist).
union(ilist,ilist,ilist).
clauses
%vspomogatelnii predikat member(E,L), proveryayushii prinadlezit li element E spisku L
member(H,[H|_]). %esli element raven golove spiska, to rezultat polozitelnii
member(X,[_|Tail]):-member(X,Tail). %esli element vstrechaetsya v hvoste spiska, to rezultat polozitelnii
%subset
subset([],_).%pustoi spisok yavlyaetsya podmnozestvom lyubogo mnozestva
subset([H|Tail],M):-member(H,M),subset(Tail,M).%esli spisok yavlyaetsya podmnozestvom,
%to ego pervii element prinadlezit mnozestvu b hvost yavlyaetsya podmnozestvom
%union
union([],B,B).%esli pervii spisok pustoi, to rezultatom objedineniya budet vtoroe mnozestvo
union([H|Tail],B,Ans):-union(Tail,B,Ans),member(H,Ans),!.%rekursivno objedinim hvost pervogo spiska
%so vtorim mnozestvom. Esli pervii element pervogo spiska uze prinadlezit etomu objedineniyu,
%to ne vstavlyaem ego v otvet
union([H|Tail],B,[H|NewTail]):-union(Tail,B,NewTail).%iz-za otsecheniya syuda popadaem
%tolko esli pervii elemement pervogo spiska ne prinadlezit objedineniyu hvosta so vtorim spisko,
%poetomu vstavlyaem ego v otvet
goal
subset([1,3,5],[1,2,3,4,5]),
union([1,2,3,4,5],[3,4,5,6,7],U),write(U),nl,nl,nl.
|