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 = "Yes
、A = "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 返回一个列表而不是几个可能的字符串的主要内容,如果未能解决你的问题,请参考以下文章