この質問の例として、main.pl
いくつかの形状の色を定義した非常に単純な Prolog ファイルがあります。
colour(circle, red).
colour(triangle, red).
colour(square, blue).
その下で、 predicate を定義します。これは、とが同じ色のsame_colour/2
場合に true です。S1
S2
same_colour(S1, S2) :-
colour(S1, C),
colour(S2, C).
トップレベルでのテストは、この述語が期待どおりに機能することを示しています。
?- same_colour(circle, triangle).
true.
?- same_colour(circle, square).
false.
SWI-Prologs 単体テスト フレームワークplunit forを使用して単体テストを作成しようとしてsame_colour/2
いますが、個々のテスト内で、そのテストの範囲内でのみ真である事実を宣言したいと考えています。setup
個々のテストのオプションと を使用してみましたがasserta
、どちらも機能しません。以下のテストはすべて失敗します。
:- begin_tests(same_colour).
test(same_colour) :-
colour(shape_a, colour_1),
colour(shape_b, colour_1),
same_colour(shape_a, shape_b).
test(same_colour) :-
asserta(colour(shape_a, colour_1)),
asserta(colour(shape_b, colour_1)),
same_colour(shape_a, shape_b).
test(same_colour, [
setup(colour(shape_a, colour_1)),
setup(colour(shape_b, colour_1))
]) :-
same_colour(shape_a, shape_b).
:- end_tests(same_colour).
私も試しました:
test(same_colour, [
setup(asserta(colour(shape_a, colour_1))),
setup(asserta(colour(shape_b, colour_1))),
cleanup(retract(colour(shape_a, colour_1))),
cleanup(retract(colour(shape_b, colour_1)))
]) :-
same_colour(shape_a, shape_b).
つまり、最初にcolour(shape_a, colour_1)
とcolour(shape_b, colour_1)
が事実であることを宣言し、テストを実行してから、それらを「宣言解除」します。ただし、このテストも失敗します。それを使用すると、決してアサートされないtrace
ようですcolour(shape_a, colour_1)
(または、少なくともテストの実行中は真実ではありません)。
Call: (18) plunit_same_colour:'unit body'('same_colour@line 13', vars) ? creep
Call: (19) same_colour(shape_a, shape_b) ? creep
Call: (20) colour(shape_a, _G738) ? creep
Fail: (20) colour(shape_a, _G738) ? creep
Fail: (19) same_colour(shape_a, shape_b) ? creep
Fail: (18) plunit_same_colour:'unit body'('same_colour@line 13', vars) ? creep
最初の 2 つのテストが機能しない理由がわかりました。前に宣言されていない場合、最初に私colour(shape_a, colour_1)
は真であるかどうかをテストしていasserta
ます. 3 回目または 4 回目のテストに似たような気がしますが、私がやろうとしていることを達成できるはずですか?