【问题标题】:Swi-prolog bug weird outputSwi-prolog bug 奇怪的输出
【发布时间】:2017-09-04 20:17:18
【问题描述】:

我有以下程序:

filter([],_What,[]).

filter(List,What,Output):-
    not(select(What-Val,List,Rest)), 
    filter([],What,Output).

filter(List,What,[Val|Output]):-
    select(What-Val,List,Rest),
    filter(Rest,What,Output).

我不明白为什么要进行以下查询:

filter([age-90, age-80,age-80],age,Output).

输出:

Output = "ZPP" 

我有最新版本的 SWI-prolog (7.4.2),并且有 El Captain (10.11.6) 的 mac。

我尝试过 guitracer,它构建列表 [90,80,80] 但输出“ZPP” 我不知道为什么会这样。

SWISH在线prolog输出[90,80,80],所以一定是SWI-Prolog的东西。

编辑

它似乎将数字转换为字符 90=Z、80=P 等...

为什么要这样做?

【问题讨论】:

  • 是的,在 SWI Prolog 中,"ZPP" 表示 ZPP 的代码“字符串”(列表)。所以它们是等价的。不确定您将 SWI Prolog 设置为哪种模式会导致它默认将 [90, 80, 80] 显示为字符串。也许更重要的是,您至少有两个单例变量并且您的查询不会终止(无限生成解决方案 Output = [90, 80, 80])。

标签: prolog


【解决方案1】:

很难说它是如何被加载的,但这种行为可以由portray_text(true)触发:

6 ?- A = [90,80,80].
A = [90,80,80].

7 ?- portray_text(true).
true.

8 ?- A = [90,80,80].
A = "ZPP".

这个想法是,如果您将文本处理为字符代码列表,则输出很难阅读。 describe_text/1 启用了一个尝试解释的 describe/1 钩子 整数列表作为字符代码列表,如果成功则将结果打印为字符串。

可以将 GUI 跟踪器配置为执行此操作,但我认为这不是默认设置。

【讨论】:

  • 这似乎是问题所在,将其设置为 true 在 mac 上不起作用,它仍然输出数字。我在 windows swi-prolog 上对其进行了测试,它在描绘_文本(true)时正确输出字符。
  • 在我的 Mac 上运行良好。此功能的可移植性也与此问题无关。开始一个新问题并包含详细信息(版本、从二进制安装、Macports、Homebrew 等。在终端或应用程序中使用等)
猜你喜欢
  • 1970-01-01
  • 2014-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多