Программа сравнения строк в 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')).
Другие вопросы по тегам