1

次のようにユーザー入力/ログインがあります:

login:- write('username: '), read(User), nl, write('password: '), read(Pass).

ユーザー名とパスワードを含むデータベースがあります。コードに示すように、検索述語を使用してすべての行をリストとして取得します。

find(R):-findall(Row, rs('SELECT name FROM patient where name=\'James\'', Row), R).

?- find(R).
 R = [row('James'), row('James'), row('James'), row('James')].

read() からのユーザー入力を使用して、そのユーザーがデータベースにいるかどうかを確認する方法はありますか?

member(User, R)を試してみましたが、うまくいきません。

プロローグは、この種のもの(ログイン/登録)に最適な言語ではないことを知っています。私がこれを行っている理由は、swi-prolog でヘルスケア エキスパート システムに取り組んでおり、患者のログインと登録が必要だからです。

これができる理由はありますか?私はプロローグが初めてなので、多くのばかげたことに行き詰まっています。

ありがとう!

............. @gusbroあなたが私に言ったように、私はmember(row(User)で試しました:

check:-findall(Row, rs('SELECT name FROM patient where name=\'James\'', Row), R),
read(User), member(row(User), R); 
write('wrong username!').

しかし、私が何を書いても常に同じになります:

?- check.
|: Bla.
true ;
wrong username!
true.

?- check.
|: James.
true ;
wrong username!
true.
4

1 に答える 1

3

行 (Atom) フォームの用語を Atom に統一しようとしているため、試したことはうまくいきませんでした。

そうすればうまくいくはずですmember(row(User), R)

ただし、この例では「行」を繰り返しているため、複数回成功することに注意してください...

setof/3の代わりに を使用することを検討することをお勧めしますfindall/3。これにより、結果のリストから重複が排除されます (また、setof のテンプレートに一致するものがない場合は、副作用として失敗します)。

于 2012-08-17T15:25:52.650 に答える