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]).

会返回真。

编辑:

我似乎能够得到我的标题,

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

但是如果我使用

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

为什么??

4

1 回答 1

0

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

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

然后test/2用自由变量查询?- test(X,Y),观察和的XY。这些值正是member/2得到的,但它只是为了告诉我们关于列表的事情而定义的。

为了在 to 的第一个参数中传递列表relation/2member/2您必须首先X通过调用谓词来实例化,然后member/2使用实例化X的作为参数进行调用:

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

请注意,的第二个参数relation/2是列表的列表,因此为了检查其中的成员,您必须使用列表作为您的第一个参数member/2,例如,

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

如果 CourseName 匹配列表的第一个元素,则为真。

于 2013-10-18T02:14:43.710 回答