首页 > 解决方案 > 更改 ​swi-prolog “true” 和 “false” 中的默认输出值以进行谓词评估

问题描述

当您在 prolog 中执行任何操作时,您可以看到评估结果如下:

真的

或者

错误的

我想将这些值更改为个性化值。

基于这个问题messages.pl,我看到文件中定义了我想要的

我发现它们被定义为:

query_result(no) -->            % failure
    [ ansi(truth(false), 'false.', []) ],
    extra_line.
query_result(yes(true, [])) -->      % prompt_alternatives_on: groundness
    !,
    [ ansi(truth(true), 'true.', []) ],
    extra_line.

我希望这样,而不是得到falseor true,我可以得到<ERROR::><PASSED::>分别用于我的单元测试。

附加信息

我正在对一个名为adition.pl仅包含的文件进行单元测试。

 my_add(A,B,Result):- number(A), number(B), is(Result,+(A,B)). 

试图

:-['C:/Users/RuslanLopez/Documents/Prolog/adittion.pl'].
%:-['C:/Program Files/swipl/boot/messages.pl'].
:- begin_tests(my_add).
:- include(adittion).
%:- use_module($messages).
%:- include(messages).
error:-write('<ERROR::>'),nl.
passed:-write('<PASSED::>'),nl.

:- dynamic(user:query_result/1).

user:query_result(no) -->            % failure
        [ ansi(truth(false),'<ERROR::>', []) ].

user:query_result(yes(true, [])) -->      % prompt_alternatives_on: groundness
        !,
        [ ansi(truth(true),'<PASSED::>' , []) ].




test(my_add):-
        my_add(1,2,Result),
        Result =:= 3.

test(my_add) :-
        my_add(1,2,Result),
        Result \= 4.

:- end_tests(my_add).

我知道更直接的解决方案是转到文件并直接在那里更改值,但我真的希望我可以在运行时进行更改以仅在我的单元测试中而不是在整个系统中更改自定义行为。

标签: unit-testingprologprolog-toplevel

解决方案


不。您想要更改 Prolog 系统的一个非常核心的部分,即顶层(循环)。但是您将需要这个顶层来交互式地诊断和调试您的程序。对顶层的任何更改也将在该上下文中可见。顶层是各种用户组使用 Prolog 数十年的结果。它包含的不仅仅是响应truefalse. 试一试X = 1,或什X = s(s(X))至,或dif(X,2)

plunit是一个可用于 SWI、SICStus 和其他一些系统的单元测试包。改用它,或者根据它的启发推出我们自己的。


推荐阅读