swi-prolog中的字符串比较程序总是失败

时间:2013-04-04 04:46:55

标签: prolog swi-prolog

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

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 个答案:

答案 0 :(得分: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。如果我们写一个变量,即一个UppercaseStartingSymbol,它会读取 Prolog术语,然后读取变量。我的错。 readln似乎没问题,但是更改模式以选择第一项。

另一个与此无关的问题:你错放了括号中的闭括号 - > '陈述'。

这里是代码:

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')).
相关问题