Создайте список с помощью abs () в прологе - PullRequest
1 голос
/ 01 апреля 2020

Я пытаюсь написать предикат для следующей задачи.

Запишите предикатные расстояния (Bs, B, Ds), где Bs и Ds являются списками переменных, так что i-й элемент Ds является абсолютной разницей между переменной B и i-м элементом Bs

знаю, что это неправильно, но это то, что, я думаю, я должен пытаться сделать

distances([],_,[]).
distances([H|T],B,A) :-abs(H - B,A),distances(T,B,A) 

Нужно ли возвращать результат предиката abs в рекурсивный вызов расстояния?

Я могу использовать abs для вычисления правильного значения для каждой записи в списке, но как мне затем поместить эту информацию в список, который затем может быть возвращен?

1 Ответ

1 голос
/ 01 апреля 2020

Предикат не возвращает . Предикат завершается успешно, терпит неудачу (застревает в бесконечном l oop или вызывает ошибку). Один использует объединение, чтобы обеспечить результаты. Фактически, здесь ваши третьи параметры Ds, вероятно, должны обеспечить результат.

Таким образом, мы можем объединить абсолютное значение D с заголовком списка третьего параметра и выполнить рекурсивный вывод Ds :

distances([], _, []).
distances([H|T], B, <b>[D|Ds]</b>) :-
    abs(H - B, <b>D</b>),
    distances(T, B, <b>Ds</b>).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...