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

时间:2011-06-20 21:24:31

标签: string list prolog logic

answer("Yes").
answer("No").
answer("Variable = value").
receive(A) :- answer(A).


2 ?- answer(A).

A = [89, 101, 115]

Yes

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

3 个答案:

答案 0 :(得分:5)

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

如果要使用术语Yes,No和Variable = value来实例化A,则应将它们用单引号括起来而不是双引号:

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

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

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

答案 1 :(得分:2)

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

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

修改:您可以使用this module做您想做的事。

答案 2 :(得分:2)

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

(其中一些可能仅适用于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;
…