【问题标题】:Check for X failures/passes?检查 X 次失败/通过?
【发布时间】:2020-03-14 16:53:37
【问题描述】:

我有一个快速的问题,我一直试图在 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.

(非常糟糕的代码示例,但希望它能够解决我的问题)。

感谢任何想法,谢谢。

【问题讨论】:

  • @GuyCoder 谢谢,但我的理解是 maplist 针对一个目标检查列表中的每个元素。因此,如果我想检查 2 个元素是否符合标准,我将无法做到这一点。

标签: prolog partitioning data-partitioning


【解决方案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].

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-23
    • 2023-03-29
    • 1970-01-01
    • 2020-08-04
    • 1970-01-01
    • 2020-07-28
    相关资源
    最近更新 更多