swi-prolog用户登录和注册

时间:2012-08-17 15:18:55

标签: prolog

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

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

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

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()中的用户输入并检查该用户是否在数据库中?

我尝试了成员(用户,R)但是它无法正常工作。

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

有什么可以做的吗?我是prolog的新手,所以我会陷入许多愚蠢的事情。

谢谢!

............. @gusbro 我尝试了成员(行(用户),因为你告诉我:

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.

1 个答案:

答案 0 :(得分:3)

您尝试的内容无效,因为您尝试将表单行(Atom)的条款与Atom统一起来。

如果你做member(row(User), R),它应该可以正常工作。

但请注意,在您的示例中,它会多次成功,因为您重复了“行”......

您可能需要考虑使用setof/3而不是findall/3,因为它会消除结果列表中的重复项(如果没有setof模板的匹配则会失败,如果是副作用) )