我目前的关系定义为:
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中的列表。所以,使用list:
[['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 :(得分:0)
您的上一个查询?- member('Course',relation2(relation(X,_)))
未成功,因为成员的第二个参数是谓词而不是列表。为了清楚地了解正在发生的事情,您可以在文件中编写谓词,如下所示:
test('Course', relation2(relation(X,_)).
然后使用自由变量test/2
查询?- test(X,Y)
,并观察X
和Y
的值。那些值正是member/2
得到的值,但它只是定义为告诉我们有关列表的事情。
为了将relation/2
的第一个参数中的列表传递给member/2
,您必须首先通过调用谓词来实例化X
,然后使用member/2
调用X
实例化?- relation2(relation(X,_)), member('Course', X).
作为参数:
relation/2
请注意member/2
的第二个参数是列表列表,因此为了检查其中的成员,您必须使用列表作为?- relation2(relation(_,X)), member([CourseName, _,_], X).
的第一个参数,例如,
{{1}}如果CourseName与列表的第一个元素匹配,则
将为true。