2016-11-09 2 views
0

Я хочу определить предикат, который берет список, добавляет элемент в список, допустим, число «1», а затем возвращает список.Prolog - Изменить и вернуть список

Я узнал, что могу добавить элементы в список, используя append/3, но я хочу использовать внутри другого предиката, поэтому я хочу, чтобы он возвращал «мой измененный список».

Мое объектно-ориентированное мышление говорит мне спросить у переводчика что-то вроде:? -append (X, 5, X). , так что он принимает список X, добавляет 5 к нему и возвращает «новый X», но я знаю, что это не то, как работает унификация, поэтому мой разум немного сбит.

Может ли кто-нибудь попытаться объяснить, как это могло бы быть достигнуто?

ответ

1

Вы уже очень близки к решению, так что я только перефразировать то, что вы уже начали ощущать:

Во-первых, вы не можете изменить список в чистом Прологе.

Вместо этого вы должны думать в терминах отношений между объектами. В вашем случае подумайте с точки зрения отношений между   списком.

Таким образом, «добавив номер 1» в списке является соотношению между двумя списками, которые могли бы выглядеть следующим образом:

list_with_one(Ls, [1|Ls]). 

Обратите внимание, что это работает в все направления! Вы можете использовать его для:

  • генерировать ответы
  • тест частные случаи
  • "обратное" направление и т.д.

Таким образом, все, что вам нужно сделать в вашем случае должен думать в терминах отношений между   списком: один без элемента, и как это относится к другому списку с элемент.

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

Примечание, в частности, что append(X, 5, X)не может держать: Прежде всего, append/3 предназначается, чтобы быть соотношение между   списков и 5 является не   список. Во-вторых, если вы писали, например append(Xs, [5], Xs), то это было бы верно, если там, где список Xs, что если элемент 5 были приложены к   Xs, результирующий список вновь будет   Xs. Удачи найти такой список   ...Обратите внимание также на соглашение об именах для обозначения списков, разрешив конец имени переменной   s.

Это также не так много, чтобы обвинить это в вашем «объектно-ориентированном мышлении», поскольку вы можете иметь объектно-ориентированное программирование в   Prolog.

0

Хотя списки в Prolog не могут быть изменены, можно добавить элементы в конец a list with an unspecified length. Таким образом, элементы могут быть «прилагается» к списку без создания другого списка:

:- initialization(main). 

append_to_list(List,Item) :- 
    append_to_list(List,Item,0). 

append_to_list(List,Item,Index) :- 
    % using SWI-Prolog's nth0 predicate 
    (nth0(Index,List,Check_Item), 
    var(Check_Item), 
    nth0(Index,List,Item)); 
    (Next_Index is Index+1, 
    append_to_list(List,Item,Next_Index)). 

main :- 
    A = [1,2,3|_], 
    append_to_list(A,4), 
    append_to_list(A,7), 
    writeln(A). 

В этом примере A становится [1,2,3,4,7|_].

Смежные вопросы