0

我正在尝试使用 swi-prolog 编写一个程序,该程序随机询问人们的名字或姓氏,并根据他们输入的内容打印“正确”或“不正确”。当前的正确答案是“Hello”和“World”,但无论用户键入什么,输出都是错误的,并且不会打印正确/错误。

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').
4

1 回答 1

1

我可以在您的代码中发现两个问题。

a) readln/1(未记录)返回项目列表(然后查看第一项或使用 read/1):

?- readln(X).
|: Hello.
X = ['Hello', '.'].

?- readln(X).
|: Hello
X = ['Hello'].

?- readln(X).
|: Hello .
X = ['Hello', '.'].

b) if then else 运算符 (->) 对总是失败,因为你忽略了两者的 else 分支,并且条件是互斥的。尝试

...
((S=@=X)->writeln('correct') ; writeln('incorrect')).

编辑有2个问题。我错误地建议阅读/1。读取一个Prolog 术语,然后读取一个变量,如果我们写入一个变量,即一个 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')).
于 2013-04-04T05:15:47.733 回答