我目前有一个关系定义为:
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]).
会返回真。
编辑:
我似乎能够得到我的标题,
?- relation2(relation(X,_)).
X = ['Course', 'Prof', 'Local'].
但是如果我使用
?- member('Course',relation2(relation(X,_))).
false.
为什么??
您的最后一个查询?- member('Course',relation2(relation(X,_)))
没有成功,因为 member 的第二个参数是谓词而不是列表。 为了清楚地了解发生了什么,您可以在文件中编写一个谓词,如下所示:
test('Course', relation2(relation(X,_)).
然后用自由变量查询test/2
,?- test(X,Y)
,观察X
和Y
的值。这些值正是member/2
得到的,但它的定义只是为了告诉我们有关列表的信息。
为了将 relation/2
的第一个参数中的列表传递给 member/2
,您必须首先通过调用谓词来实例化X
,然后使用实例化的X
作为参数调用member/2
:
?- relation2(relation(X,_)), member('Course', X).
请注意,relation/2
的第二个参数是列表列表,因此为了检查其中的成员,您必须使用 list 作为member/2
的第一个参数,例如,
?- relation2(relation(_,X)), member([CourseName, _,_], X).
如果课程名称与列表的第一个元素匹配,则为 true。