0

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

1 に答える 1

1

あなたのコードには 2 つの問題があります。

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つの問題があります。私は間違って read/1 を提案しました。これはProlog termを読み取り、次に変数、つまり 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 に答える