我再次被一个非常简单的Prolog任务所困。我想定义一个谓词kv_search/3
,它将键/值列表(如[[a,1],[b,2],[c,3],[d,4],[e,8],[a,9],[b,10]]
(作为第一个参数,将键作为第二个参数,并在第三个参数中输出具有该键的所有值的列表。
我目前的方法如下所示:
kv_find([[K,V|_]|Rest], K, Result) :-
kv_find(Rest, K, [V|Result]).
kv_find([[Ks,_|_]|Rest], K, Result) :-
Ks = K ,
kv_find(Rest, K, Result).
kv_find([], _, _).
然而,此解决方案的问题在于它只输出 true 或 false,而不是打印缺少的参数。
例如,以下查询结果是true
而不是我的预期结果B=[1, 9]
:
kv_find([[a,1],[b,2],[c,3],[d,4],[e,8],[a,9],[b,10]], a, B).
如果列表中不存在该键,我想输出一个空列表。
首先,您的基本情况是错误的,您需要编写:
kv_find([], _, []).
因为对于空列表,只有空输出列表应该成功。
然后你的解决方案中的另一个问题是你正在编写:
kv_find([[K,V|_]|Rest], K, Result) :-
kv_find(Rest, K, [V|Result]).
虽然你应该写一些类似的东西:
kv_find([[K,V|_]|Rest], K, [V | Result]) :-
kv_find(Rest, K, Result).
上面带有错误基本大小写的规则使您的谓词始终适用于任何第三个列表。
此外,通过一些更改,我会写一些类似的东西:
kv_find([[K,V]|Rest], K, [V|Result]) :-
kv_find(Rest, K, Result).
kv_find([[Ks,_]|Rest], K, Result) :-
dif(Ks, K) ,
kv_find(Rest, K, Result).
kv_find([], _, []).