Программа сравнения строк в swi-прологе всегда дает сбой
Я пытаюсь написать программу, используя swi-пролог, который случайным образом запрашивает у людей их имя или фамилию и печатает "правильно" или "неправильно" в зависимости от того, что они печатают. Текущие правильные ответы - "Привет" и "Мир", но независимо от того, что пользователь вводит, вывод ложный, а правильный / неправильный не печатается.
start:-(Q=['What is your first name?','What is your last name?'],
random_member(N,[0,1]),
nth0(N,Q,X),
writeln(X)),
readln(S),
check_answer(N,S).
check_answer(N,S):-A=['Hello','World'],
nth0(N,A,X),
writeln(X),
(S=@=X)->writeln('correct'),
not(S=@=X)->writeln('incorrect').
Я позже отредактировал это, чтобы:
start:-(Q=['What is your first name?','What is your last name?'],
random_member(N,[0,1]),
nth0(N,Q,X),
writeln(X)),
read(S),
check_answer(N,S).
check_answer(N,S):-A=['Hello','World'],
nth0(N,A,X),
writeln(X),
writeln(S),
((S=@=X))->writeln('correct') ; writeln('incorrect').
1 ответ
Я могу заметить две проблемы в вашем коде.
a) readln / 1 (недокументированное) возвращает список элементов (затем просмотрите первый элемент или используйте read/1):
?- readln(X).
|: Hello.
X = ['Hello', '.'].
?- readln(X).
|: Hello
X = ['Hello'].
?- readln(X).
|: Hello .
X = ['Hello', '.'].
б) Пара операторов if then else (->) всегда будет неудачной, поскольку вы опускаете ветвь else в обоих случаях, а условия являются исключительными. Пытаться
...
((S=@=X)->writeln('correct') ; writeln('incorrect')).
редактировать есть 2 проблемы. Я ошибочно предложил прочитать /1. Это читает термин Пролог, а затем читает переменную, если мы пишем переменную, то есть UppercaseStartingSymbol. Моя вина. readln кажется нормальным, но измените шаблон, чтобы выбрать первый элемент.
Еще одна проблема, не связанная: вы поместили закрытые скобки в -> 'Statement'.
Вот код:
start:-(Q=['What is your first name?','What is your last name?'],
random_member(N,[0,1]),
nth0(N,Q,X),
writeln(X)),
readln(S),
check_answer(N,S).
check_answer(N,[S|_]):-A=['Hello','World'],
nth0(N,A,X),
writeln(X),
writeln(S),
((S=@=X)->writeln('correct') ; writeln('incorrect')).