Prolog代码给出两种不同的结果



所以我做这个代码,有一个函数接收两个参数,并告诉如果其中一个不是一个列表。

代码如下:

/*** List Check ***/
islist(L) :- L == [], !.
islist(L) :- nonvar(L), aux_list(L).
aux_list([_|_]).
/*** Double List Check ***/
double_check(L, L1) :- +islist(L) -> write("List 1 invalid"); 
    +islist(L1)-> write("List 2`invalid"); write("Success").

它应该可以工作。在线代码完全按照我的意愿运行。但是在我电脑的Prolog控制台,它给出了一个完全不同的答案:

?- double_check(a, [a]).
[76,105,115,116,97,32,49,32,105,110,118,97,108,105,100,97] 
true.

的例子。我不知道这个名单是从哪来的。有人能告诉我我的错误,并帮助我修复它吗?谢谢大家!

快速修复:用format/2代替write/1 !有关内置谓词format/2的更多信息,请单击此处。

$ swipl --traditional
Welcome to SWI-Prolog (Multi-threaded, 64 bits, Version 7.1.37) [...]
?- write("abc").
[97,98,99]                                % output by write/1 via side-effect
true.                                     % truth value of query (success)
?- format('~s',["abc"]).
abc                                       % output by format/2 via side-effect
true.                                     % truth value (success)

但是使用不同的命令行参数:

$ swipl 
Welcome to SWI-Prolog (Multi-threaded, 64 bits, Version 7.1.37) [...]
?- write("abc").
abc
true.
?- format('~s',["abc"]).
abc
true.

尽管看起来很麻烦,我还是建议使用命令行选项--traditional来处理SWI-Prolog,并结合使用format/2而不是write/1保存可移植性!

相关内容

最新更新