Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unit testing 更改​;swi序言“;“真的”;及;假;用于谓词求值的_Unit Testing_Prolog_Prolog Toplevel - Fatal编程技术网

Unit testing 更改​;swi序言“;“真的”;及;假;用于谓词求值的

Unit testing 更改​;swi序言“;“真的”;及;假;用于谓词求值的,unit-testing,prolog,prolog-toplevel,Unit Testing,Prolog,Prolog Toplevel,在prolog中执行任何操作时,您可以看到评估结果如下: 真的 或 假的 我想将这些值更改为个性化值 基于此,我看到我想要的是在messages.pl文件中定义的 我发现它们被定义为: query_result(no) --> % failure [ ansi(truth(false), 'false.', []) ], extra_line. query_result(yes(true, [])) --> % prompt_alter

在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
true

附加信息 我正在对一个名为
adition.pl
的文件进行单元测试,该文件只包含以下内容

 my_add(A,B,Result):- number(A), number(B), is(Result,+(A,B)). 
企图
:-['C:/Users/RuslanLopez/Documents/Prolog/adittion.pl']。
%:-['C:/ProgramFiles/swipl/boot/messages.pl']。
:-开始测试(我的添加)。
:-包括(adittion)。
%:-使用_模块($messages)。
%:-包括(消息)。
错误:-写入(“”),nl。
通过:-写入(“”),nl。
:-动态(用户:查询结果/1)。
用户:查询结果(否)-->%失败
[ansi(真(假),'',[])]。
用户:查询结果(是(真,[])-->%prompt\u alternations\u on:groundness
!,
[美国国家标准协会(真实),'',[])]。
测试(我的添加):-
我的加(1,2,结果),
结果=:=3。
测试(我的添加):-
我的加(1,2,结果),
结果\=4。
:-结束测试(我的添加)。

我知道更简单的解决方案是直接转到文件并在那里更改值,但我真的希望我可以在运行时进行更改,仅在单元测试中更改自定义行为,而不是整个系统。您需要更改Prolog系统的一个非常核心的部分,即toplevel(循环)。但是,您将需要此顶层以交互方式诊断和调试您的程序。toplevel的任何更改也将在该上下文中可见。toplevel是各种用户组几十年来使用Prolog的结果。它包含的内容远不止响应
true
false
。只要试试
X=1
,甚至
X=s(s(X))
,或者
dif(X,2)


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

顶级只是一个谓词
prolog/0
,它在prolog解释器启动时运行。命令行选项允许运行另一个谓词,如果默认情况下需要不同的顶级,则需要修改现有的is代码

在我的Prolog系统中,我得到了一个完全用Prolog本身编写的开源顶层。它还可以显示已解决的约束。其开放源代码如下:

开源:模块“会话”

true和false值通过属性文件进行国际化。所以在德语中你可以看到“Ja”和“Nein”,在英语中你可以看到“Yes”和“No”。由于国际化API并没有真正标准化,您会发现一些自定义的内置调用

需要通过以下语句预加载属性文件:

:- sys_load_resource(runtime).
然后,根据当前语言设置,通过这样的代码序列检索键的值:

sys_show_assoc([], _) :-
   get_properties(runtime, P),
   get_property(P, 'query.yes', V),
   write(V).

你不能根据成功或失败来测试和打印谓词吗?(此外,您是否查看了@DavidTonhofer yes,但是,它会在控制台中打印true或false,这就是我希望在不创建repl的情况下保持沉默的原因。这个想法似乎是为了修改用户的演示文稿,用户使用的是口译员的repl,而不是定制的repl。这一要求似乎是不必要的拜占庭式和“楔入式的”?@DavidTonhofer我不会从解释器repl调用它,它将在docker容器中运行。通过这种方式,可以将编程练习添加到codewars.com站点,是否可以启动Prolog进程并使用PLTP(“Prolog传输协议”)执行查询/响应交换正如这里所描述的:那么,你是说不可能动态地重新定义系统谓词吗?(我的问题的上下文)重新定义系统谓词实际上从来都不是一个好主意。(如果你想纠正一个错误的定义,可能会有例外。否则,永远不会).那么这是可能的?请阅读手册。您在原始问题中提出的问题不可能是那样的。您必须更改源代码才能获得。祝您好运。
sys_show_assoc([], _) :-
   get_properties(runtime, P),
   get_property(P, 'query.yes', V),
   write(V).