domains
  list = symbol*
  
predicates
  member(list, symbol)
  unique(list)
  nondeterm course(symbol)
  rule1(symbol, symbol, symbol, symbol, symbol, symbol)
  rule2(symbol, symbol, symbol, symbol, symbol, symbol)
  rule3(symbol, symbol, symbol, symbol, symbol, symbol)
  rule4(symbol, symbol, symbol, symbol, symbol, symbol)
  find(symbol, symbol, symbol, symbol, symbol, symbol)
  
clauses
  member([H|_], H) :- !.
  member([_|T], V) :- member(T, V).
  member([], _) :- fail.
  
  unique([]). 
  unique([H|T]) :- not(member(T, H)), unique(T).
  
  course("История"). 
  course("Математика"). 
  course("Биология"). 
  course("География"). 
  course("Английский"). 
  course("Французский").
  
  % Географ и француз - не один человек
  rule1("География", "Французский", _, _, _, _) :- !, fail.
  rule1(_, _, "География", "Французский", _, _) :- !, fail.
  rule1(_, _, _, _, "География", "Французский") :- !, fail.
  rule1("Французский", "География", _, _, _, _) :- !, fail.
  rule1(_, _, "Французский", "География", _, _) :- !, fail.
  rule1(_, _, _, _, "Французский", "География") :- !, fail.
  rule1(_, _, _, _, _, _).

  % Биолог и математик - не один человек.
  rule2("Биология", "Математика", _, _, _, _) :- !, fail.
  rule2(_, _, "Биология", "Математика", _, _) :- !, fail.
  rule2(_, _, _, _, "Биология", "Математика") :- !, fail.
  rule2("Математика", "Биология", _, _, _, _) :- !, fail.
  rule2(_, _, "Математика", "Биология", _, _) :- !, fail.
  rule2(_, _, _, _, "Математика", "Биология") :- !, fail.
  % Биологию ведет не Морозов
  rule2("Биология", _, _, _, _, _) :- !, fail.
  rule2(_, "Биология", _, _, _, _) :- !, fail.
  rule2(_, _, _, _, _, _).

  % Либо Токарев - не биолог и не француз
  % Биолог и француз - не один человек.
  rule3(_, _, _, _, "Биология", _) :- !, fail.
  rule3(_, _, _, _, _, "Биология") :- !, fail.
  rule3(_, _, _, _, "Французский", _) :- !, fail.
  rule3(_, _, _, _, _, "Французский") :- !, fail.
  rule3("Биология", "Французский", _, _, _, _) :- !, fail.
  rule3(_, _, "Биология", "Французский", _, _) :- !, fail.
  rule3(_, _, _, _, "Биология", "Французский") :- !, fail.
  rule3("Французский", "Биология", _, _, _, _) :- !, fail.
  rule3(_, _, "Французский", "Биология", _, _) :- !, fail.
  rule3(_, _, _, _, "Французский", "Биология") :- !, fail.
  rule3(_, _, _, _, _, _).

  % Морозов - не математик и не англичанин.
  % Математик и англичанин - не один человек.
  rule4("Математика", _, _, _, _, _) :- !, fail.
  rule4(_, "Математика", _, _, _, _) :- !, fail.
  rule4("Английский", _, _, _, _, _) :- !, fail.
  rule4(_, "Английский", _, _, _, _) :- !, fail.
  rule4("Математика", "Английский", _, _, _, _) :- !, fail.
  rule4(_, _, "Математика", "Английский", _, _) :- !, fail.
  rule4(_, _, _, _, "Математика", "Английский") :- !, fail.
  rule4("Английский", "Математика", _, _, _, _) :- !, fail.
  rule4(_, _, "Английский", "Математика", _, _) :- !, fail.
  rule4(_, _, _, _, "Английский", "Математика") :- !, fail.
  rule4(_, _, _, _, _, _).

  find(C11, C12, C21, C22, C31, C32) :-
      rule1(C11, C12, C21, C22, C31, C32),
      rule2(C11, C12, C21, C22, C31, C32),
      rule3(C11, C12, C21, C22, C31, C32),
      rule4(C11, C12, C21, C22, C31, C32).

goal
  T1 = "Морозов", T2 = "Васильев", T3 = "Токарев",
  course(C11), course(C12), course(C21), course(C22), course(C31), course(C32),
  unique([C11, C12, C21, C22, C31, C32]),
  find(C11, C12, C21, C22, C31, C32), !,
  write("Учитель - ", T1, "; предметы - ", C11, " и ", C12, "."), nl,
  write("Учитель - ", T2, "; предметы - ", C21, " и ", C22, "."), nl,
  write("Учитель - ", T1, "; предметы - ", C31, " и ", C32, "."), nl.
