Вы уже очень близки к решению, так что я только перефразировать то, что вы уже начали ощущать:
Во-первых, вы не можете изменить список в чистом Прологе.
Вместо этого вы должны думать в терминах отношений между объектами. В вашем случае подумайте с точки зрения отношений между списком.
Таким образом, «добавив номер 1» в списке является соотношению между двумя списками, которые могли бы выглядеть следующим образом:
list_with_one(Ls, [1|Ls]).
Обратите внимание, что это работает в все направления! Вы можете использовать его для:
- генерировать ответы
- тест частные случаи
- "обратное" направление и т.д.
Таким образом, все, что вам нужно сделать в вашем случае должен думать в терминах отношений между списком: один без элемента, и как это относится к другому списку с элемент.
Очевидно, что эти два списка будут обозначены различными переменными и различных аргументов.
Примечание, в частности, что append(X, 5, X)
не может держать: Прежде всего, append/3
предназначается, чтобы быть соотношение между списков и 5
является не список. Во-вторых, если вы писали, например append(Xs, [5], Xs)
, то это было бы верно, если там, где список Xs
, что если элемент 5
были приложены к Xs
, результирующий список вновь будет Xs
. Удачи найти такой список ...Обратите внимание также на соглашение об именах для обозначения списков, разрешив конец имени переменной s.
Это также не так много, чтобы обвинить это в вашем «объектно-ориентированном мышлении», поскольку вы можете иметь объектно-ориентированное программирование в Prolog.