Пролог - Использование append для возврата одного списка - PullRequest
1 голос
/ 04 апреля 2020

Напишите треугольник предикатов (Bs, Ds), где Bs - список позиций foo, а Ds - (один) список различий в положении. Используйте встроенный предикат append и собственный предикат расстояний.

Это связано с этими вопросами: Составьте список с помощью abs () в прологе

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

triangle([],[]).
triangle([H|T], [D|Dt]) :-  distances(T,H,D), triangle(T,Dt).


?- triangle([1,2,3],A).
A = [[1, 2], [1], []].

Решение, которое мне требуется

?- triangle([1,2,3],A).
A = [1,2,1].

Ответ правильный, но он есть в списке списков.

У меня проблемы с превращением D в один список. Я пытался использовать append в разных позициях внутри предиката, но либо получаю повторы, либо предикат оценивается как ложный. Как я могу превратить Ds в один список [1,2,3] с добавлением?

1 Ответ

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

Вы можете добавить список D с помощью Dt вместо использования [D|Dt], где вы, таким образом, добавляете список с одним элементом D:

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