2017-02-28 68 views
0

我試圖在序言至implemente訪問控制系統,並在我的代碼中的一些觀點,我這兩個規則:圖建設的Prolog

canRead(S,O):- readPermissionsRole(R,O),holds(S,R). 
canWrite(S,O):-writePermissionRole(R,O),holds(S,R). 

什麼,我需要做的是有作爲導致一代表兩條規則結果的圖表;如果canRead(S,O),我們有從O到S的優勢。如果canWrite(S,O),則從S到O的邊。 這怎麼辦?
謝謝。

+0

定義要如何在Prolog中表示您的圖表。你能舉一個簡單的例子嗎? 「S」和「O」的可能值的「宇宙」是什麼?以及如何確定?換句話說,例如,如何定義'valid_s(S)'和'valid_o(O)'? – lurker

+0

@lurker ...變量S和O表示Sbjects和Oubjects,我將在開始時使用assert predicat來實例化...這個想法是,我有主題和對象以及角色.......角色有通過對象讀取和寫入權限..和主題可以保存角色,因此角色對對象也具有讀寫權限。是這些權限,我想把它放在一個圖形中,就像我的問題中描述的一樣,從O到S的邊緣如果是canRead(S,O)。如果canWrite(S,O),則從S到O的邊。 – StamDad

+0

你可以單獨創建它們,然後合併:'findall(OS,canRead(S,O),Readers)'和'findall(SO,canWrite(S,O),Writers)',然後'Append(Readers,Writers ,邊緣)'。在這裏,「邊緣」看起來像「a-b」。 – lurker

回答

0

變量值不會在單獨的查詢中持續存在。

要獲得所有的邊緣,你需要做的是這樣的:

readers_and_writers(Edges) :-- 
    findall(O-S, canRead(S,O), Readers), 
    findall(S-O, canWrite(S, O), Writers), 
    append(Readers, Writers, Edges). 
0

@lurker ....我想你的解決方案,但我得到如下:

?- findall(O-S, canRead(S,O), Readers). 
Readers = [o2-u1, o2-u3, o1-u1, o1-u3, o3-u1, o3-u3, o1-u2, o1-u3, ... - ...|...]. 

41 ?- findall(S-O, canWrite(S, O), Writers). 
Writers = [u1-o1, u4-o1, u1-o2, u4-o2, u1-o3, u4-o3, u1-o1, u3-o1, ... - ...|...]. 

42 ?- append(Readers, Writers, Edges). 
Readers = [], 
Writers = Edges ; 
Readers = [_G2477], 
Edges = [_G2477|Writers] ; 
Readers = [_G2477, _G2483], 
Edges = [_G2477, _G2483|Writers] ; 
Readers = [_G2477, _G2483, _G2489], 
Edges = [_G2477, _G2483, _G2489|Writers] ; 
Readers = [_G2477, _G2483, _G2489, _G2495], 
Edges = [_G2477, _G2483, _G2489, _G2495|Writers] ; 
Readers = [_G2477, _G2483, _G2489, _G2495, _G2501], 
Edges = [_G2477, _G2483, _G2489, _G2495, _G2501|Writers] ; 
Readers = [_G2477, _G2483, _G2489, _G2495, _G2501, _G2507], 
Edges = [_G2477, _G2483, _G2489, _G2495, _G2501, _G2507|Writers] ; 
Readers = [_G2477, _G2483, _G2489, _G2495, _G2501, _G2507, _G2513], 
Edges = [_G2477, _G2483, _G2489, _G2495, _G2501, _G2507, _G2513|Writers] ; 
Readers = [_G2477, _G2483, _G2489, _G2495, _G2501, _G2507, _G2513, _G2519], 
.... 

我用SETOF中的findall的地方,刪除重複的結果,並仍然有一些結果不showen。

+0

這是不正確的。你不能這樣做,因爲在單獨的查詢中,變量不會持久。看到我的答案,它用連詞(',')連接查詢。 – lurker

+0

我發佈的答案是否解決了您的問題? – lurker

+0

是的...只是測試它.....謝謝你。 – StamDad