составление списка, поиск и сравнение чисел в прологе - PullRequest
0 голосов
/ 13 мая 2011

Я не смог решить эту сложную задачу:

name(jack, math, 50).
name(daniel, math, 60).
name(jane, phys, 70).
name(eto, comp, 73).

предикат: nameGrade(P, L, S). P - это список людей, которые берут урок L и чей балл превышает S.

nameGrade([jack], math, 45). возвращает true

nameGrade([jack, daniel], math, 55). возвращает false.(потому что Джек набрал 50, что меньше 55)

nameGrade([], phys, 80). возвращает true

nameGrade(X, math, 70). возвращает X = [jack, daniel]

nameGrade([jack, daniel], math, X). возвращает X= 50.(меньше).

Спасибо.

1 Ответ

0 голосов
/ 13 мая 2011

Вы можете использовать findall/3, чтобы вернуть список элементов, удовлетворяющих предикату:

nameGrade(P, L, S) :- is_list(P), name(_, _, S), findall(X, (name(X, L, S0), S0 >= S), P).
nameGrade(P, L, S) :- number(S), findall(X, (name(X, L, S0), S0 >= S), P).

Однако в вашем требовании есть несколько противоречивых целей. Например, nameGrade([jack], math, 45) должен потерпеть неудачу, потому что и jack, и daniel принимают math и имеют более высокие оценки, чем 45. nameGrade(X, math, 70) должен вернуть [], потому что никто не берет math с более высоким счетом, чем 70.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...