2012-08-17 134 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