Пролог возвращает список вместо нескольких возможных строк - PullRequest
1 голос
/ 21 июня 2011
answer("Yes").
answer("No").
answer("Variable = value").
receive(A) :- answer(A).


2 ?- answer(A).

A = [89, 101, 115]

Yes

Я хочу A = "Yes" и т. Д. Что я делаю не так?

Ответы [ 3 ]

5 голосов
/ 21 июня 2011

Вы получаете представление списка строк Да, Нет и Переменная = значение.

Если вы хотите создать экземпляр A с терминами Да, Нет и Переменная = значение, вы должны заключить их в одинарные кавычки вместо двойных кавычек:

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

и если вы хотите вернуть условия с включенными двойными кавычками, вы должны включить их, но также заключить каждый термин в одинарные кавычки:

answer('"Yes"').
answer('"No"').
answer('"Variable = value"').
2 голосов
/ 21 июня 2011

Здесь все в порядке, вы просто видите внутреннее представление строк.Если вы хотите более читаемый вывод, попробуйте один из них:

(некоторые из них могут работать только в 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;
…
2 голосов
/ 21 июня 2011

Вы не делаете ничего плохого.[89, 101, 115] совпадает с "Yes":

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

Редактировать: Вы можете использовать этот модуль , чтобы делать то, что вы хотите.

...