序言;找到列表项

时间:2017-12-12 18:47:06

标签: list prolog

我有一个对列表,想要找到具有相应第一个值的元素。

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

因此,在这种情况下,我希望(9,[23,23])中的结果为R

代码是

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

尽管元素存在,它总是返回false。还有其他方式可以回归,因为我对Prolog很新。

2 个答案:

答案 0 :(得分:6)

以下是使用内置member/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]).

答案 1 :(得分:2)

好吧,你不需要member/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的结果。