1

我有如下用户输入/登录:

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

我有一个包含用户名和密码的数据库。我使用 find 谓词将所有行作为列表获取,如代码所示:

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)但它不能正常工作。

我知道 prolog 不是这种东西(登录/注册)的最佳语言。我这样做的原因是我正在 swi-prolog 中开发 helath 护理专家系统,我需要为患者登录和注册。

为什么可以这样做?我是 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 回答