我有一个对列表,想要找到具有相应第一个值的元素。
?- 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很新。
答案 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的结果。