作为这个问题的一个例子,我有一个非常简单的 Prolog 文件main.pl
,我在其中定义了一些形状的颜色。
colour(circle, red).
colour(triangle, red).
colour(square, blue).
现在在下面我定义一个 predicate same_colour/2
,如果两者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编写单元测试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
我现在可以理解为什么前两个测试不起作用了。在第一个我测试是否colour(shape_a, colour_1)
为真,当它之前没有被声明时,第二个我只是不认为asserta
在谓词定义中使用它是正确的。虽然感觉类似于我的第三次或第四次测试应该能够实现我想要做的事情?