unit-testing - 更改 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.
我希望这样,而不是得到false
or 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).
我知道更直接的解决方案是转到文件并直接在那里更改值,但我真的希望我可以在运行时进行更改以仅在我的单元测试中而不是在整个系统中更改自定义行为。
解决方案
不。您想要更改 Prolog 系统的一个非常核心的部分,即顶层(循环)。但是您将需要这个顶层来交互式地诊断和调试您的程序。对顶层的任何更改也将在该上下文中可见。顶层是各种用户组使用 Prolog 数十年的结果。它包含的不仅仅是响应true
和false
. 试一试X = 1
,或什X = s(s(X))
至,或dif(X,2)
。
plunit
是一个可用于 SWI、SICStus 和其他一些系统的单元测试包。改用它,或者根据它的启发推出我们自己的。
推荐阅读
- python-3.x - 声明 x = somelist.append 并使用 x 将一些值附加到 somelist 时出现问题
- firebase - Flutter 本地通知适用于模拟器,但不适用于物理设备
- r - 如何将 R 函数中的参数用作文本和表达式?
- express - 快速路由器在阵列中添加中间件
- python-3.x - 在 Python 中使用掩码从矩阵中获取列表
- javascript - 参考错误:当我尝试通过 nodemon myWebJs.js 运行时未定义 $ ...一切都在浏览器上运行..只是节点不工作
- html - 如何在 Dart 中测试(TDD)“HtmlDocument”?
- typescript - browser.addcommand() 在 webdriverIO 中使用 typescript “无法编译 TypeScript:错误 TS2339:属性 '...' 在类型 'Element' 上不存在。”
- python - VSCode 中的 iPython Notebook 通过 Pipenv shell:关于环境不对齐的两个问题
- excel - Powershell csv删除行