Вывести на экран список тех студентов, чьи увлечения полностью или частично удовлетворяют определенному списку.
domains
sym_list=symbol*.
predicates
student(real, symbol, integer, symbol, sym_list).
clauses
student(101, alekseev, 1996, "I12", [football, tennis]).
student(102, ivanov, 1996, "I12", [games, computer]).
student(103, petrov, 1996, "I12", [football, tv]).
student(104, orlov, 1996, "I12", [games, tennis]).
student(201, sidorov, 1997, "I13", [games, web]).
student(202, kruglov, 1997, "I13", []).
student(203, vorobyev, 1997, "I13", [football, web]).
student(204, lomov, 1997, "I13", [tv, web]).
У меня следующее решение:
domains
sym_list=symbol*.
predicates
student(real, symbol, integer, symbol, sym_list).
intersect (sym_list, sym_list, sym_list).
memb(symbol,sym_list).
delete_all(symbol, sym_list, sym_list).
list_set(sym_list,sym_list).
find_student(sym_list, symbol).
clauses
student(101, alekseev, 1996, "I12", [football, tennis]).
student(102, ivanov, 1996, "I12", [games, computer]).
student(103, petrov, 1996, "I12", [football, tv]).
student(104, orlov, 1996, "I12", [games, tennis]).
student(201, sidorov, 1997, "I13", [games, web]).
student(202, kruglov, 1997, "I13", []).
student(203, vorobyev, 1997, "I13", [football, web]).
student(204, lomov, 1997, "I13", [tv, web]).
%функция удаления повторяющихся элементов
delete_all(_,[],[]).
delete_all(X,[X|L], L1):- delete_all(X,L,L1).
delete_all(X,[Y|L], [Y|L1]):-X<>Y, delete_all(X,L,L1).
list_set([],[]).
list_set([H|T],[H|T1]):-delete_all(H,T,T2), list_set(T2,T1).
%поиск пересечения
memb(_,[]) :- fail.
memb(X,[X|_]) :- !.
memb(X,[_|T]) :- memb(X,T).
intersect([],_,[]).
intersect([H|T],Y,[H|R]) :- memb(H,Y),intersect(T,Y,R), !.
intersect([_|T],Y,R1) :- intersect(T,Y,R), list_set(R,R1), !.
find_student(R1,Name):-I=R1, student(_,Name,_,_,R1), intersect(R1,I,Res), I=R1.
Не понимаю как связать эти функции с find_student, чтобы выводилось то, что требуется в задаче.