我有以下用户输入/登录:
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.
答案 0 :(得分:3)
您尝试的内容无效,因为您尝试将表单行(Atom)的条款与Atom统一起来。
如果你做member(row(User), R)
,它应该可以正常工作。
但请注意,在您的示例中,它会多次成功,因为您重复了“行”......
您可能需要考虑使用setof/3
而不是findall/3
,因为它会消除结果列表中的重复项(如果没有setof模板的匹配则会失败,如果是副作用) )