判断给定元素是否在双精度列表中

时间:2012-04-04 14:04:41

标签: list prolog tuples

我有A = [[1,2],[2,3],[3,4],[5,5]]

形式的双打列表

我要做的是创建一个函数,如果一个数字是任何双精度数中的第一个数字,它将返回true。因此somefunction(7,A)将返回false,somefunction(5,A)将返回true。

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

3 个答案:

答案 0 :(得分:2)

除了自己进行递归之外,您还可以使用"更高阶次"谓词maplist/3nth0/3结合使用,只选择列表的第一个元素,然后对结果发出member/2调用,以达到您想要的效果:

somefunction(Element, List) :-
    maplist(nth0(0), List, Firsts),
    member(Element, Firsts).

答案 1 :(得分:2)

member([N,_],As).

但这里有两点评论:

首先,您真的想要[[1,2],[3,4]]这样的列表吗?如果您总是有两个元素,请考虑使用对。也就是说,使用仿函数(-)/2。它通常写成Key-Value。你会这样写[1-2,3-4]。通常使用对列表,keysort/2仅根据Key进行排序。

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

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

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

答案 2 :(得分:1)

你可以像这样递归地执行:

检查值是否在列表的开头:

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

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

somefunction(A,[BH|BT]) :- somefunction(A,BT).