Пролог - вывод списка? - PullRequest
       13

Пролог - вывод списка?

0 голосов
/ 18 декабря 2008

У меня есть функция

sublist(_,[_],_) :-
    !.
sublist(X,[Y|T],Z) :-
    R is X - Y,
    sublist(X,T,[R|Z]).

пример вызова sublist(2,[1,2,3],Z). В конце выполнения это просто дает мне «да», но я бы хотел увидеть содержимое Z.

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

Ответы [ 2 ]

3 голосов
/ 04 апреля 2009

Я также собираюсь предположить, что sublist / 3 должен вычитать число из всех элементов в списке.

Причина, по которой вы не получаете никакого результата для Z, заключается в том, что вы строите список на пути к рекурсии. Это означает, что, когда предикат остановки завершается успешно, Пролог работает, выходя из рекурсии, и Z снова становится необработанным.

Z is ?
    |
    Z is [-1]
        |
        Z is [-1, 0]
            |
            Z is [-1, 0, 1]
            |
        Z is [-1, 0]
        |
    Z is [-1]
    |
Z is ?

Попробуйте сначала войти в рекурсию и составить свой список на выходе. Может быть так:

subtract_list(_, [], []).

subtract_list(Number, [Head|Tail], [Subtracted|Result]):-
    subtract_list(Number, Tail, Result),
    Subtracted is Head - Number.

Все, что мы изменили, - это порядок правил в рекурсивном предикате и условия условия остановки. Теперь он повторяется до тех пор, пока не достигнет пустого списка, после чего он создает экземпляр переменной результата с пустым списком. Затем он снова создает пузыри, добавляя значения в список.

?- subtract_list(1,[4,3,2],Z).
Z = [3, 2, 1] 

Надеюсь, это поможет. Том

1 голос
/ 18 декабря 2008

Вы действительно не указываете, что sublist/3 должен делать, но, возможно, вы имеете в виду это:

sublist(_, [], []) :- !.

sublist(X, [Y | T], [R | Z]) :-
    R is X - Y,
    sublist(X, T, Z).

Пример использования:

?- sublist(2, [1, 2, 3], Z).
Z = [1, 0, -1].

Кстати, если вы не хотите сами перебирать список, то вы можете использовать maplist/3, предоставленный SWI-Prolog. Сначала определите желаемый расчет:

my_calculation(X, Y, Z) :-
    Z is X - Y.

, а затем позвоните maplist/3:

?- maplist(my_calculation(2), [1, 2, 3], Z).
Z = [1, 0, -1].
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...