如何从关系中提取我的列表 [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 中的列表。因此,使用列表:

[['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),观察XY的值。这些值正是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。

最新更新