2

我在表格中有一个双打列表A = [[1,2],[2,3],[3,4],[5,5]]

我想要做的是创建一个函数,如果一个数字是任何双打中的第一个数字,它将返回 true。所以somefunction(7,A)会返回假,somefunction(5,A)也会返回真。

我已经尝试过了somefunction(A,B) :- A == (B,_),但这没有任何用处。

4

3 回答 3

2

或者自己进行递归,您可以使用“高阶”谓词maplist/3结合nth0/3仅选择列表的第一个元素,然后member/2对结果发出调用以实现您想要的:

somefunction(Element, List) :-
    maplist(nth0(0), List, Firsts),
    member(Element, Firsts).
于 2012-04-04T14:37:18.507 回答
2

member([N,_],As).

但这里有两点说明:

首先,你真的想要这样的列表[[1,2],[3,4]]吗?如果您总是有两个元素,请考虑使用对。也就是说,使用函子(-)/2。它经常被写Key-Value。你会这样写[1-2,3-4]。对的列表是常用的,有keysort/2哪些只根据Key.

其次,“名称查找”的常用习语如下:

..., P = (Name-Value), member(P, Dict), ...

这里值得注意的是,对于对列表或我们拥有的任何其他元素,我们不需要“特殊”成员谓词。我们现在可以“按名称”或“按值”搜索,或者两者都搜索,或者都不搜索...

于 2012-04-05T14:36:55.553 回答
1

您可以像这样递归地执行此操作:

检查该值是否位于列表的开头:

somefunction(A,[[A,_]|_]).

然后递归检查该值是否在列表的其余部分中:

somefunction(A,[BH|BT]) :- somefunction(A,BT).
于 2012-04-04T14:07:26.240 回答