Ответ в теме: База данных успеваемости студентов. Список на отчисление.

      Комментарии к записи Ответ в теме: База данных успеваемости студентов. Список на отчисление. отключены
#1924

Пример записи базы данных:
успеваемость(математика, 'Петров', 5, 2).

Я думаю, стоит сначала получить список всех студентов:
findall(Студент, успеваемость(_Предмет, Студент, _Оценка, _Попыток), Студенты).

А затем, обходить список и выполнять требуемые проверки:

отчисление([], []):-!.
отчисление([Студент|Остальные], [Студент|ОстальныеОтчисленные]):-
  успеваемость(Предмет_1, Студент, 2, _), успеваемость(Предмет_2, Студент, 2, _), 
  Предмет_1 \= Предмет_2, !, 
  отчисление(Остальные, ОстальныеОтчисленные).
отчисление([_Студент|Остальные], ОстальныеОтчисленные):-
  отчисление(Остальные, ОстальныеОтчисленные).

На вход подается список имен всех студентов. Если список пуст — то отчислять некого, функция возвращает пустой список.
В противном случае из списка выбирается первый студент. Программа пытается найти в базе данных два предмета, по которым студент получил двойки, при этом следит чтобы это были два разных предмета. Если поиск проходит удачно — то текущий студент добавляется в начало списка, остальные элементы списка вычисляются рекурсивно. Если текущий студент не подлежит отчислению — результат работы функции совпадает с результатом рекурсивного вызова.