Проверить на X сбои / пропуски? - PullRequest
1 голос
/ 14 марта 2020

У меня быстрый вопрос, который я пытался выяснить в Прологе. Есть ли способ проверить, как минимум 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.

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

Любые мысли приветствуются, спасибо.

1 Ответ

1 голос
/ 14 марта 2020

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

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

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

Пример выполнения

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

Другой способ использования списка и раздел / 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].
...