引数を持たない述語の成功と失敗の数をカウントしたい。簡単にするために、テストする述語は test_arith/0 です。test_arith/0 には is/2 の 3 つのテストがあります (ここでも簡単にするためです。私が書いているより複雑な述語を本当にテストしたいのですが、それらの詳細はこの質問の邪魔になるでしょう。) (PS についての他の質問を見ました述語が真である回数をカウントする. 1 回のパスで成功と失敗の両方をカウントしたい. テスト ケースごとに実際の述語を複数回実行する必要はありません. 一部の述語には時間がかかるためです. 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 は 1 回だけ呼び出されるように見えるためです。私は取得する必要があります
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 しかありません。失敗の数が必要であり、各述語をテスト実行ごとに 1 回だけ実行する必要があります。この場合は 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.