Как добавить списки в Prolog? - программирование
Подтвердить что ты не робот

Как добавить списки в Prolog?

Как добавить списки в Prolog? Я искал в Интернете, и я нашел это (от http://www.csupomona.edu/~jrfisher/www/prolog_tutorial/2_7.html)

append([X|Y],Z,[X|W]) :- append(Y,Z,W).  
append([],X,X).

Таким образом, он получает Z, удаляя элементы [X|Y] в [X|W]. Но как добавить два списка вместе?

Пример,

appendlist([1,2],[3,4,5],X).

Результат будет X = [1,2,3,4,5].

Также я не знаю, что происходит в рекурсии. (Я проследил его, но не понял)

EDIT: Что я хочу знать, так это то, как он должен быть закодирован для работы как предопределенный append() в Prolog.

4b9b3361

Ответ 1

Код, который вы опубликовали, в порядке (почти). Порядок предложений просто нужно поменять местами (чтобы сделать это определение предиката продуктивным, если оно используется в генеративном ключе):

append( [], X, X).                                   % your 2nd line
append( [X | Y], Z, [X | W]) :- append( Y, Z, W).    % your first line

Это определяет связь между тремя аргументами, скажем, A, B и C

Ваша первая строка говорит: " C является результатом добавления A и B если A и C являются непустыми списками, они оба имеют одинаковую головку (то есть первый элемент), а хвост C является результатом добавления хвоста A с тем же вторым аргументом, B ".

  a        a
  ----------
  b        b
  c        c
  .    d   d
       e   e
       .   .

Или слева направо:

         a | b c .
           |     d e .
         a | b c d e .

append(         [], 
                 Z,
                 Z ).       
append( [X | Y   ],
                 Z,
        [X |         W ] ) :- append(
             Y,  Z,  W).

Подумайте об этом, это имеет смысл. Это то, что мы делаем, мы хотим определить отношение append/3, и мы знаем, каким мы хотим, чтобы оно было, поэтому мы просто записываем некоторые очевидные факты об этом, которые мы хотим, чтобы они выполняли, законы, которым оно должно следовать, если вы будут.

Итак, если у нас уже есть этот код, какие законы должны ему следовать? Очевидно, что добавление хвоста некоторого списка к другому списку дает нам хвост результата добавления полного списка к этому второму списку.

Это определяет, как мы "скользим" по первому списку. Но что, если некуда больше кататься? Что если мы достигли конца этого списка? Затем мы достигли пустого списка, и добавление пустого списка к другому списку дает нам этот список в качестве результата. Очевидно. И то, что говорит нам эта вторая строка в вашем коде, говорит: "добавление пустого списка к другому списку приводит к получению этого списка".

Удивительно, что записать эти два закона, которые должны следовать append/3, - это то же самое, что записать само определение.

дополнение: это объясняет это с декларативной точки зрения; проверьте ответ по m09, который показывает его больше с оперативной точки зрения.

Ответ 2

Но как добавить два списка вместе?

Вы ответили на свой вопрос: вы используете append/3.

Если вы хотите добавить X и Y и сохранить результат в Z, вы

append(X, Y, Z)

Если, например, X = [1, 2] и Y = [3, 4, 5], то Z будет привязано к [1, 2, 3, 4, 5]:

| ?- append([1,2],[3,4,5], X).

X = [1,2,3,4,5]

yes
| ?-