Prolog 返回一个列表而不是几个可能的字符串

Posted

技术标签:

【中文标题】Prolog 返回一个列表而不是几个可能的字符串【英文标题】:Prolog returns a list instead of several possible strings 【发布时间】:2011-09-19 01:12:19 【问题描述】:
answer("Yes").
answer("No").
answer("Variable = value").
receive(A) :- answer(A).


2 ?- answer(A).

A = [89, 101, 115]

Yes

我想要A = "Yes" 等。我做错了什么?

【问题讨论】:

【参考方案1】:

您将获得字符串 Yes、No 和 Variable = value 的列表表示形式。

如果您想使用术语 Yes、No 和 Variable = value 来实例化 A,您应该将它们括在单引号而不是双引号之间:

answer('Yes').
answer('No').
answer('Variable = value').

如果你想返回包含双引号的术语,你应该包括它们但也用单引号括起来每个术语:

answer('"Yes"').
answer('"No"').
answer('"Variable = value"').

【讨论】:

【参考方案2】:

你没有做错任何事。 [89, 101, 115]"Yes" 相同:

2 ?- [89, 101, 115] = "Yes".
true.

编辑:您可以使用this module 做您想做的事。

【讨论】:

我想你误会了我。我希望 Prolog 列出我给谓词的所有值,因为它们被写成字符串......也就是说,A = "YesA = "No"A="Variable = value" 如果您希望将字符代码列表打印为字符串,请参阅特定 Prolog 系统的 set_prolog_flag/2 文档。【参考方案3】:

这里没有错,你只是看到了字符串的内部表示。 如果您想要更易读的输出,请尝试以下方法之一:

(其中一些可能只在 SWI-Prolog 中工作,但您已将其标记为 SWI,所以我认为这没问题)

使用name/2 将数字列表转换为原子:

?- name(X, "hallo").
X=hallo

?- answer(X), name(Y, X).
X = [89, 101, 115],
Y = 'Yes' ;

使用format/2 输出。

format('~s',["hallo"]).
hallo
true.

?- answer(X), format('answer is "~s"',[X]).
answer is "Yes"
X = [89, 101, 115] ;
answer is "No"
X = [78, 111].

或者,如果您不想使用真正的字符串(代码点列表),请使用单引号:

answer('yes').
answer('no').
answer('Variable = value').

?-answer(X).
yes;
…

【讨论】:

以上是关于Prolog 返回一个列表而不是几个可能的字符串的主要内容,如果未能解决你的问题,请参考以下文章

如何使用append / 3以递归方式在prolog中构建列表?

检查元素后返回列表的Prolog谓词

Prolog - 如何返回每个元素只出现一次的列表?

Prolog 如何通过交错将列表列表构造成单个列表?

Prolog 中如何表示谓词逻辑?

一个汉字算一个字符吗