List 序言;查找列表项

List 序言;查找列表项,list,prolog,List,Prolog,我有一个成对的列表,希望找到具有相应第一个值的元素 ?- findconn1(9, [(9,[23,33]),(42,[21,322])], R). 因此,在本例中,我希望结果是中的(9,[23,23]) 代码是 findconn(X, [], R). findconn(X, [(H,T)|Y], R) :- member(X, H), findConn(X, Y), append(T, T, R). 它总是返回false,尽管元素存在。还有没有其他方法可以返回,因为我对P

我有一个成对的列表,希望找到具有相应第一个值的元素

?- findconn1(9, [(9,[23,33]),(42,[21,322])], R).
因此,在本例中,我希望结果是
中的
(9,[23,23])

代码是

findconn(X, [], R).
findconn(X, [(H,T)|Y], R) :-
   member(X, H),
   findConn(X, Y),
   append(T, T, R).

它总是返回
false
,尽管元素存在。还有没有其他方法可以返回,因为我对Prolog还很陌生

好吧,你不需要
会员/2
。只需对基本情况和递归情况使用模式匹配,如下所示:

findconn1(N,[(N,B)|_],N-B). %basecase

findconn1(N,[(_,_)|T],R):-
    findconn1(N,T,R).
因此,键入查询时:

?- findconn1(42,[(9,[23,33]),(42,[21,322])],R).
    R = 42-[21, 322] 

在R中得到结果。

下面是一种使用内置
成员/2
谓词的简单方法:

findconn1(X,L,(X,L1)):- member((X,L1),L).
例如:

?- findconn1(9,[(9,[23,33]),(42,[21,322])],R).
R =  (9, [23, 33]) ;
false.
对于上述解决方案,请注意,如果9不止一次存在,您将获得所有解决方案:

?- findconn1(9,[(9,[23,33]),(42,[21,322]),(9,[1,2])],R).
R =  (9, [23, 33]) ;
R =  (9, [1, 2]).

您不需要使用
member/2
,使用模式匹配。我该怎么办that@Coder. 你为什么删除你的答案?它显然优于另一个答案,后者基本上是
member/2
..@coder的一个专门样板重新实现。好!!下次,不要删除。让我们这样做吧。让投票/评论/编辑发言…@重复一遍,好的,谢谢你的评论!!!如果我必须在标准ml中做同样的事情,那么我该怎么做。你说的标准ml是什么意思?比如如果我想在标准ml编程语言中实现同样的功能如果你说的是命令式编程语言,比如java等等,然后您需要使用循环,而不能使用这种递归结构,因为java没有Prolog那样的模式匹配。每种语言在某些方面都不同于其他语言。这些被称为声明性语言,prolog是逻辑语言,因此对于java来说,例如,您需要循环etcUsing
member/2
绝对是一种方法!相反,您选择基本上重新实现它。样板代码?糟糕!