Использование пролога =.. предикат

Я работаю над упражнением, в котором пытаюсь использовать предикат =.., чтобы написать процедуру, которая удаляет все элементы в 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 в фильтр и все заработало.

Другие вопросы по тегам