Сдвиг списка N раз с использованием пролога []: - Упражнение 3.6 «Программирование пролога для искусственного интеллекта» Ивана Бтрако - PullRequest
1 голос
/ 06 марта 2019

Я хочу создать предикат shift(List1,List2), где List2 - это List1, смещенное вращательно на один элемент влево. Пример:

?- shift([1,2,3,4],L1), shift(L1,L2), shift(L2,L3).
L1 = [2, 3, 4, 1],
L2 = [3, 4, 1, 2],
L3 = [4, 1, 2, 3].

Я создал предикат

conc([],L,L).
conc([X|T],L2,[X|T1]) :-
   conc(T,L2,T1).

shift([H|T],L2) :-
   conc(T,H,L2).

Однако, это неправильно, и я не понимаю, почему ... Это работает, только если H окружен [H].

shift([H|T],L2) :-
   conc(T,[H],L2).

Предикат без [ ] работает только с 1 сменой и выдает следующее:

?- shift([1,2,3,4],L1).
L1 = [2, 3, 4|1].

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

1 Ответ

0 голосов
/ 07 марта 2019

Работает, только если H окружен [H]

Как я отмечал до , conc/3 на самом деле является стандартным предикатом append / 3 , который принимает два списка и создает третий список.

append/3 говорит:

append (? List1,? List2,? List1AndList2)
List1AndList2 - это объединение List1 и List2

Один термин не является списком, например, 1 - это не список, но [1] - это список.
Список начинается с [ и заканчивается ].

Это пустой список: []

В списке может быть один элемент: [a]

или более одного элемента: [a,b] и т. Д. Обратите внимание, что они всегда имеют квадратные скобки.

Когда вы используете conc/3 или append/3, все три значения должны быть списком, поэтому даже если вы хотите объединить или добавить один элемент, вы должны сначала преобразовать его в список, окружив его [], чтобы превратить это в список. Таким образом, отдельный элемент 1 преобразуется в список как [1].

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