Использование пролога =.. предикат
Я работаю над упражнением, в котором пытаюсь использовать предикат =.., чтобы написать процедуру, которая удаляет все элементы в List, для которых PredName(X) завершается ошибкой, и возвращает оставшийся список как Result:
filter(List, PredName, Result)
В этом случае PredName определяется как:
test(N) :- atom(N).
Например:
?- filter([a,b,-6,7,A,-1,0,B], test, L).
L = [a,b,-6,7,-1,0],
У меня есть следующее, но я не уверен, почему я получаю false в результате тестирования с примером выше:
test(N):-
atomic(N).
filter([], _, []).
filter2([H|T], PredName, [H|S]):-
Goal =.. [PredName, H],Goal,filter(T, PredName, S),!.
filter([H|T], PredName, S) :-
filter2(T, PredName, S).
Я получил вышеуказанный код отсюда.
2 ответа
Вы пытались скомпилировать код?
Я получил:
Предложения filter/3 не находятся вместе в исходном файле
Зачем? Потому что вам нужно решить, как вызвать предикат: filter2/3
или же filter/3
, Вы в настоящее время используете оба имени.
Кроме того, когда у вас есть такой код:
Цель =.. [PredName, H], Цель
Просто использовать call/2
вместо. Например, вышесказанное можно эквивалентно записать в виде:
вызов (PredName, H)
В итоге:
- определиться с именем предиката и придерживаться его
- не использовать
(=..)/2
для таких случаев - действительно использовать
call/2
,
Починил это. У меня были проблемы с именами, которые я раньше не ловил. Переименовал filter2 в фильтр и все заработало.