Как печатать все возможные оценки рекурсивным или любым другим способом?

Alastor спросил: 10 мая 2018 в 04:49 в: prolog

Хорошо, я реализовал предикат show (Name, Grade)., который работает следующим образом

?-show(Name,8).
Name=Jim;
Name=Ann;
false
?-show('Jim',Grade).
Grade=8;
false

Я хочу создать предикат mostGrades (Name, Grade), который находит худшего ученика в классе, реализующем show (Name, Grade) каким-то образом и нажав ; возвращает второй худший ученик, затем третий и т. д., как этот

?-worstGrades(Name,Grade).
Name=Bob,Grade=3;
Name=Max,Grade=5;
Name=Pete,Grade=5; 
....

Я думаю, что решение имеет что-то делать с рекурсивным доступом к show (Name, Grade) с переменной Grades от (0,10), но я не могу придумать способ сделать это в данный момент. Любая помощь?

1 ответ

Есть решение
user27815 ответил: 10 мая 2018 в 05:10

Вы можете использовать что-то вроде:

show('Jim',8).
show('Anne',8).
show('bob',6).
show('fred',7).worst_grades(Name,Grade):-
    setof(Grade-Name,show(Name,Grade),Grades),
    member(Grade-Name,Grades). 

Запрос:

?-worst_grades(Name,Grade).
Grade = 6,
Name = bob;
Grade = 7,
Name = fred;
Grade = 8,
Name = 'Anne';
Grade = 8,
Name = 'Jim'
Alastor ответил: 10 мая 2018 в 07:46
Большое спасибо другу! Проблема, которую я описал, была упрощенной версией более сложной проблемы, над которой я работаю, и я использовал менталитет вашего решения для решения своей проблемы. Спасибо снова, хорошо провели день