2012-08-17 133 views
1

我有用户输入/登录如下:SWI-序言用户登录和注册

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')]. 

有没有使用来自读取用户输入(),并检查该用户在数据库的方法吗?

我试过会员(用户,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. 

回答

3

什么你试过没有工作,因为你正在试图统一表格行(凌动)以原子为

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

但是请注意,在你的例子会成功一次,因为你重复“行”更多...

你可能要考虑使用setof/3代替findall/3,因为它会消除所产生的重复列表(如果没有setof模板的匹配,将会失败的副作用)

+0

感谢您的帮助,您有任何其他想法吗?因为这不适用于我:( – user1598696 2012-08-17 16:59:40

+0

)如果您输入的名字以大写字母开头,则必须用单引号括起来,例如'|:'James'.'。另外,阅读规则时请注意,回溯时最终告诉你'错误的用户名' – gusbro 2012-08-17 17:17:38

+0

aaa是的,我忘记了引号,它现在正在工作,非常感谢! – user1598696 2012-08-17 17:30:33