@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。
定義要如何在Prolog中表示您的圖表。你能舉一個簡單的例子嗎? 「S」和「O」的可能值的「宇宙」是什麼?以及如何確定?換句話說,例如,如何定義'valid_s(S)'和'valid_o(O)'? – lurker
@lurker ...變量S和O表示Sbjects和Oubjects,我將在開始時使用assert predicat來實例化...這個想法是,我有主題和對象以及角色.......角色有通過對象讀取和寫入權限..和主題可以保存角色,因此角色對對象也具有讀寫權限。是這些權限,我想把它放在一個圖形中,就像我的問題中描述的一樣,從O到S的邊緣如果是canRead(S,O)。如果canWrite(S,O),則從S到O的邊。 – StamDad
你可以單獨創建它們,然後合併:'findall(OS,canRead(S,O),Readers)'和'findall(SO,canWrite(S,O),Writers)',然後'Append(Readers,Writers ,邊緣)'。在這裏,「邊緣」看起來像「a-b」。 – lurker