Пролог поиск ключа / списка значений и вывод списка значений - PullRequest
0 голосов
/ 21 октября 2018

Я снова застрял с довольно простой задачей Пролога.Я хочу определить предикат 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).

Если ключ отсутствует в списке, я хочу вывести пустой список.

1 Ответ

0 голосов
/ 21 октября 2018

Во-первых, ваш базовый случай неверен, вам нужно написать:

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([], _, []).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...