Проверить наличие X ошибок/проходов?

У меня есть быстрый вопрос, который я пытался выяснить на Прологе. Есть ли способ проверить хотя бы X ошибок (или прохождения) в предикате?

Например, здесь я мог бы проверить, меньше или равно ли одно из значений 20, но я пытаюсь проверить их все одновременно, если хотя бы одно из них меньше или равно 20, без необходимости указать 3 разных предиката, проверяющих первую оценку, затем вторую и третью по отдельности.

scores(score1, 14, 60, 45).

# Checks to see if at least one of the scores is less than or equal to 20
at_least_one_fail(X):- scores(X, Y), Y > 20, scores(X, Z), Z > 20, scores(X, J), J =< 20.
at_least_one_fail(X):- scores(X, Y), Y > 20, scores(X, Z), Z =< 20, scores(X, J), J > 20.
at_least_one_fail(X):- scores(X, Y), Y =< 20, scores(X, Z), Z > 20, scores(X, J), J > 20.

(Действительно плохой пример кода, но, надеюсь, он понял суть моего вопроса).

Любые мысли оценены, спасибо.


person jjwood1600    schedule 14.03.2020    source источник
comment
@GuyCoder спасибо, но я так понимаю, что список карт проверяет каждый элемент в списке на соответствие одной цели. Поэтому, если бы я хотел проверить, соответствуют ли, скажем, 2 элемента критерию, я бы не смог этого сделать.   -  person jjwood1600    schedule 14.03.2020


Ответы (1)


Вот приблизительный ответ с использованием фактов и findall/3.

score(14).
score(60).
score(45).

test(Scores) :-
    findall(Score,(score(Score), Score > 20),Scores).

Пример запуска

?- test(Scores).
Scores = [60, 45].

Другой способ с использованием списка и partition/4

partition_predicate(X) :-
    X > 20.

test_2(Greater,Less) :-
    List = [14,60,45],
    partition(partition_predicate ,List,Greater,Less).

Пример запуска

?- test_2(Greater,Less).
Greater = [60, 45],
Less = [14].
person Guy Coder    schedule 14.03.2020