Мне нужно реализовать программу Prolog, которая принимает список, такой как [[1, a], [2, b], [1, c]] и запрашивает ключ в петле. Если пользователь вводит 1 [a, c], должен быть напечатан, и пользователю следует попросить следующий ключ, пока пользователь не войдет в «выход».Пролог читает ключи и печатает значения, соответствующие клавише
Моя текущая программа:
%Input: AssocList and Key.
%Output: FindList which contains all Values associated with the Key in AssocList.
as_find(AssocList, Key, FindList) :-
as_find(AssocList, Key, Acc, FindList).
as_find([], Key, Acc, Acc).
as_find([], Key, Acc, FindList) :- as_find([], Key, Acc, Acc).
as_find([[Key,D]|R], Key, Acc, FindList) :- my_append(D, Acc, NewFindList), as_find(R, Key, NewFindList, FindList).
as_find([[H,D]|R], Key, List, FindList) :- as_find(R, Key, List, FindList).
%Appends Elem to the given list and returns it in the other list.
my_append(Elem,[],[Elem]).
my_append(Elem,[H|R],[H|Z]) :- my_append(Elem,R,Z).
%Asks for Keys and writes all Values associated with the keys.
as_search(List) :-
repeat,
write('Key?'),
read(Key),
as_find(List, Key, FindList),
write(FindList),
Key == 'genug',
!.
К сожалению Если я использую другой ключ, чем «сделано» программка завершится в бесконечном цикле. Не могли бы вы помочь?
С уважением, Гиперион
Есть ли какие-либо преимущества в использовании 'fail' в предложении органов' Тест/2'? – repeat
Думаю, вам не понадобится вторая неудача. Первый сбой зависит от того, хотите ли вы, чтобы цель была успешной или сбой по умолчанию. Ill отредактируйте его, чтобы удалить их. – user27815
Правильно! Не может быть лучшего способа. Но сохранение простых вещей является хорошим дефолтом, ИМО. – repeat