我想计算没有任何参数的谓词的成功和失败次数。为简单起见,我要测试的谓词是 test_arith/0。test_arith/0 对 is/2 进行了 3 个测试(再次,为了简单起见。我真的很想测试我正在编写的更复杂的谓词,但这些细节会分散这个问题的注意力。)(PS 我看到了另一个关于计算谓词为真的次数。我想一次性计算成功和失败。我不想在每个测试用例中多次运行真正的谓词,因为其中一些需要很长时间执行。aggregate/3 和 aggregate_all 似乎也是一心一意的,只考虑成功。)
test_arith(Passes, Failures) :-
findall(P-F, (test_arith->(P=1,F=0);(P=0,F=1)), Scores),
summarize_scores(Scores, 0, 0, Passes, Failures).
test_arith :- 5 is 3 +2. % Test #1: Should pass
test_arith :- 5 is 2 +2. % Test #2: Should fail
test_arith :- 4 is 2 +2. % Test #3: Should pass
summarize_scores([], Passes, Failures, Passes, Failures).
summarize_scores([P-F|Scores], Passes_SF, Failures_SF, Passes, Failures) :-
Next_Passes is P + Passes_SF,
Next_Failures is F + Failures_SF,
summarize_scores(Scores, Next_Passes, Next_Failures, Passes, Failures).
当我跑
test_arith(P,F).
我明白了
P = 1,
F = 0.
因为 test_arith 似乎只被调用一次。我应该得到
P = 2,
F = 1.
谢谢你提供的所有帮助。
我试过了:
test_arith(Passes, Failures) :-
bagof(P-F, A^(test_arith(A)->(P=1,F=0);(P=0,F=1)), Scores),
summarize_scores(Scores, 0, 0, Passes, Failures).
test_arith(_) :- 5 is 3 +2.
test_arith(_) :- 5 is 2 +2.
test_arith(_) :- 4 is 2 +2.
test_arith2(Passes) :-
aggregate(count, A^test_arith(A), Passes).
test_arith(P,F) 得出:P = 1,F = 0。 test_arith2(P) 得出“2”。(这很好,但只有我正在寻找的 1/4。我需要失败计数,并且每个谓词在每次测试运行时只运行一次,在这种情况下需要 3 次调用。)
然后我尝试为每个测试用例添加一个数字:
test_arith(Passes, Failures) :-
bagof(P-F, A^(test_arith(A)->(P=1,F=0);(P=0,F=1)), Scores),
summarize_scores(Scores, 0, 0, Passes, Failures).
test_arith(1) :- 5 is 3 +2.
test_arith(2) :- 5 is 2 +2.
test_arith(3) :- 4 is 2 +2.
并得到:
test_arith(P,F).
P = 1,
F = 0.