Я новичок в Prolog, и я пытаюсь сделать викторину, где пользователю даются 3 вопроса и 3 варианта для каждого вопроса. После каждого вопроса задается 3 возможных варианта ответов. Пользователь набирает ответ на этот вопрос, и отображается следующий вопрос, а викторина продолжается до тех пор, пока все 3 не будут заданы и не ответят.Сравнивать факты и результаты вывода
Что я хочу сделать, это сравнить каждый ответ пользователя с правильным ответом на этот вопрос и вывести его, если пользователь прав, неправильно или пропустил вопрос. Я думаю, что я прав, говоря, что мне нужно сравнить с фактами в знаниях базы данных со статическими фактами. Я понимаю, что это не настоящая проблема, но если кто-то может дать мне совет, как наилучшим образом достичь моей цели, было бы весьма полезно. Я просто смущен. При необходимости будет предоставлена дополнительная информация.
question(1,'What is the fifth planet of our Solar System?').
question(2,'In what year was George Best born?').
question(3,'What is the capital of Austraila?').
possibleAns(1,[mars,jupiter,saturn]).
possibleAns(2,[1945,1946,1948]).
possibleAns(3,[sydney,canberra,melbourne]).
rightAns(1,jupiter).
rightAns(2,1946).
rightAns(3,canberra).
skip(s).
%Confused as to how best to achieve the comparing and output
check_answer(AnsNo,userChoice):-
rightAns(AnsNo,Choice),
userAnswer(AnsNo,userChoice)
getChoice(ChoiceNo,ChoiceList):-
write('Choose from'),nl,
write(ChoiceList),nl,
read(Choice),
(member(Choice,ChoiceList);skip(Choice)),
%userAnswer will compare with rightAnswer
assert(userAnswer(ChoiceNo,Choice)).
getChoice(ChoiceNo,ChoiceList):-
writeln('Illegal Choice'),
getChoice(ChoiceNo,ChoiceList).
//check if the question has been asked
//if not, write question
//get users choice and move to next question
get_question(PreviousAsked):-
question(QNum,Text),
\+ member(QNum,PreviousAsked),
write(Text),nl,
possibleAns(QNum,ChoiceList),
getChoice(QNum,ChoiceList),
get_question([QNum|PreviousAsked]).
get_question(_).
start_quiz:-
get_question([]).
Updated
getChoice(ChoiceNo,ChoiceList):-
write('Choose from'),nl,
write(ChoiceList),nl,
read(Choice),
(member(Choice,ChoiceList);skip(Choice)),
assert(userAnswer(ChoiceNo,Choice)).
( rightAns(ChoiceNo,Choice)
-> write('Right!'),nl;
write('Wrong,'),nl).
Спасибо за помощь Карлес. Это помогло мне. После ответа на все вопросы вы проверяете ответы пользователей, как вы проходите каждый пользовательский ответ и вывод, если это правильно или неправильно. Например, Q1 правильно, Q2 ошибочно, Q3 - вправо. –
Вы можете использовать 'assert (correct (ChoiceNo)).' Right after 'write ('Right!').'. Затем вызов 'findall (Q, correct (Q), Qs).' В конце викторины даст вам все правильно ответившие вопросы. Тем не менее, это путь «нужный» и «грязный». Если вы предпочитаете избегать вызовов 'assert' (как рекомендовал @CapelliC), я бы предложил вам подумать о другом подходе к вашему алгоритму; больше похож на @CapelliC. –