2013-10-17 44 views
0

我現在有一個關係定義爲:如何從關係提取我的列表[序言]

relation2(relation(['Course', 'Prof', 'Local'], 
       [['COMP232', 'Tim W.', 'H6010'], 
       ['COMP248', 'Louise L.', 'H5605'], 
       ['COMP348', 'Mohamed T.', 'H7610']])). 

我也有一個功能:

member(X, [X|_]). 
member(X, [_|Rest]) :- member(X, Rest). 

我如何將能夠使用列表在關係2中的成員函數。所以,使用列表:

[['Course', 'Prof', 'Local'], [...] ] 

我的目標是使用關係內的列表,並驗證是否列表中的第一個元素(讓它命名爲header = ['Course','Prof','Local'])是該列表的成員。所以,

?- member('Name', [header]). 

會返回true。

編輯:

我似乎能夠得到我的頭,

?- relation2(relation(X,_)). 
X = ['Course', 'Prof', 'Local']. 

但是,如果使用

?- member('Course',relation2(relation(X,_))). 
false. 

爲什麼?

+0

爲什麼這樣一個人爲的表示?爲什麼不簡單地使用事實清單?如果需要,您可以使用標準內置謂詞(例如'findall/3')隨時收集列表中的相關事實。 –

+0

關係概念強加於我,別無選擇,只能使用它:P。 – Irslambouf

回答

0

您最後一個查詢?- member('Course',relation2(relation(X,_)))未成功,因爲成員的第二個參數是謂詞而非列表。要獲得什麼事情有清醒的認識,你可以寫在文件中的謂詞是這樣的:

test('Course', relation2(relation(X,_)). 

,然後查詢test/2與自由變量,?- test(X,Y),並觀察XY值。這就是那些值正是member/2越來越多,但它只是定義爲告訴我們有關列表的東西。

爲了通過在relation/2member/2第一個參數列表中,您必須通過調用謂詞首先實例X,然後調用member/2與實例X作爲參數:

?- relation2(relation(X,_)), member('Course', X). 

注意relation/2的第二個參數是列表的列表,因此爲了檢查其中的成員,您必須使用列表作爲第一個參數member/2,例如,

?- relation2(relation(_,X)), member([CourseName, _,_], X). 

如果CourseName與列表的第一個元素匹配,則爲true。