swi prolog用户登录和注册

swi prolog用户登录和注册,prolog,Prolog,我的用户输入/登录如下: 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')

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

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

我尝试了成员(用户,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.

您尝试的方法不起作用,因为您正在尝试将表单行(Atom)的术语和Atom统一起来

如果您使用
成员(行(用户),R)
,它应该可以正常工作

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


您可能想考虑使用<代码> SETOF/3 而不是<代码> FUNDALL/3 ,因为它将从生成的列表中删除重复(如果SUTF的模板没有匹配,如果失败,则副作用)

谢谢您的帮助,您还有其他的想法吗?因为这对我不起作用:(如果您输入的姓名以大写字母开头,则必须将其括在单引号中,例如,
:“James”。
。此外,请阅读规则说明,回溯后,它最终会告诉您“错误的用户名”。