Как использовать append / 3 в Прологе, чтобы найти последние 2 элемента списка - PullRequest
0 голосов
/ 19 января 2019

Используя системный предикат append/3, запишите предикаты для возврата:

  1. последний элемент списка
  2. последние 2 элемента списка
  3. theпоследние n элементов списка
  4. первые n элементов списка.

спасибо, любая помощь будет оценена.

Ответы [ 2 ]

0 голосов
/ 20 января 2019

Последний элемент: append(_, [X], List)

Последние два элемента: append(_, [X, Y], List)

Последние n элементов: length(LastN, N), append(_, LastN, List)

Первые n элементов: length(FirstN, N), append(FirstN, _, List)

0 голосов
/ 19 января 2019

Что означает append( A, B, C)? Это значит

 A=[..........]
           B=[.........]
 C=[...................]

Что значит

     length( B, 2)

означает? Это значит

            B = [X | B1           ],
            length(  B1, 1)

и так, это значит

            B = [X | B1           ],
                     B1 = [Y | B2],
            length(            B2,  0)
  % i.e.
            B = [X | B1           ],
                     B1 = [Y | B2],
                               B2 = []
  % i.e.
            B = [X | B1           ],
                     B1 = [Y | []]
  % i.e.
            B = [X |      [Y | []]]  = [X | [Y]]
              = [X ,       Y | [] ]
              = [X,        Y      ]

и так

B = [X, Y], append( A, B, C)

означает

 A=[..........]
           B=[XY]
 C=[..........XY]

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

one_before_last(C, X) :-
  % you can finish this up now!

И когда мы увидели, что B = [_, _] означает length( B, 2) (то есть мы отслеживаем наши уравнения в обратном порядке), мы можем использовать другие вещи в качестве аргументов length. Для решения ваших других заявленных проблем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...