检查 X failures/passes?
Check for X failures/passes?
我有一个小问题,我一直试图在 Prolog 中解决这个问题。有什么方法可以检查谓词中至少 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.
(非常糟糕的代码示例,但希望它能理解我的问题)。
任何想法表示赞赏,谢谢。
这是一个使用事实和 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].
我有一个小问题,我一直试图在 Prolog 中解决这个问题。有什么方法可以检查谓词中至少 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.
(非常糟糕的代码示例,但希望它能理解我的问题)。
任何想法表示赞赏,谢谢。
这是一个使用事实和 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].