PDA

View Full Version : Prolog help please


clash
10-26-2006, 04:56 PM
Hey guys, just starting AI and doing a simple program in prolog. In the below code (i know its messy etc) but userAns is a dynamic list holding basically a question, the users responce to that question and whether or not the user got it right/wrong or skipped it.

But in my 2nd main function (in bold) writeln(userAns), doesn't work. It doesn't seem to recongise userAns as the list. Can anyone help please ?

I assume theres some sort of "out of scope" issue that i'm just not aware of ...

:- dynamic userAns/3.



%Questions


q('The sky is ? ',['1. brown','2. blue '], 2).

q('sugar is ? ',['1. sour','2. sweet'], 2).



main :-

q(Question,PossibleAnswers,RightAnswer),

writeln('Answer the following question using the question number or 0 to skip.'),

writeln(Question),

writeln(PossibleAnswers),

read(Ans),

result(q(Question,PossibleAnswers,RightAnswer),Ans ),

fail.



main :-

writeln('Your finished, results are as follows'),

writeln(userAns), <--Doesn't seem to recongise as the dynamic list.

fail.

main.



result(q(Question,PossibleAnswers,Ans),Ans):-

assertz(userAns(Question,correct,Ans)),!.



result(q(Question,PossibleAnswers,_),0):-

assertz(userAns(Question,skipped,Ans)),!.



result(q(Question,PossibleAnswers,_),_):-

assertz(userAns(Question,wrong,Ans)),!.

pater
10-27-2006, 01:28 PM
Uh, Oh... Been a very long time since I last used Prolog...

Your Problem seems to be that userAns is not a list, it's a predicate.
The System looks for userAns/0 when you attempt to print it, which obviously doesn't exist. You have to iterate over all matches to userAns/3 and write out those strings.

I couldn't really find the exact solution yet, since as said, haven't used it for quite a while.

Devoto
10-27-2006, 04:05 PM
Funny, now I am studying lists in prolog. Maybe I can help you in a near future!!!

Trap D
10-29-2006, 01:57 AM
userAns is an atom. userAns(X,Y,Z) is a tuple.
You should do that :

forall(userAns(A,B, C), (write(A), write(' '), write(B), write(' '), writeln(C))),