如何从关系中提取我的列表[Prolog]

时间:2013-10-17 22:39:14

标签: prolog

我目前的关系定义为:

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.

为什么?

1 个答案:

答案 0 :(得分:0)

您的上一个查询?- member('Course',relation2(relation(X,_)))未成功,因为成员的第二个参数是谓词而不是列表。为了清楚地了解正在发生的事情,您可以在文件中编写谓词,如下所示:

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

然后使用自由变量test/2查询?- test(X,Y),并观察XY的值。那些值正是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。