Здесь есть несколько проблем.Прежде всего, вызов типа:
sf(X) :- append(<b>second(X)</b>, <b>first(X)</b>, X).
не имеет никакого смысла вообще: здесь second/1
и first/1
рассматриваются как функторы .Они не имеют ничего общего с предикатами second/1
и first/1
.append/3
получает три термина: second(X)
, first(X)
и X
.Однако он ожидает списки, что означает, что он ожидает пустую константу списка []
или функтор "cons" (например, [H|T]
, мы могли бы видеть это как функтор []/2
).
Таким образом, мымы не хотим создавать функтор, мы хотим объединить список с переменной, а затем добавить их.Таким образом, мы можем переписать это следующим образом:
sf(X) :- <b>second(X)</b>, <b>first(X)</b>, append(X, X, X).
Но теперь это все еще неверно, здесь мы объединяем первый и второй список с помощью X
, и добавляем его к X
, append(X, X, X)
canуспешен только в одном случае: если X
- пустой список, так как добавление двух пустых списков приводит к пустому списку.
sf(X) :- second(<b>S</b>), first(<b>F</b>), append(<b>S</b>, <b>F</b>, X).
Но это все равно не удастся.Причина в том, что ваши предикаты first/1
и second/1
делают не возвращаемых списков, эти возвращаемые элементы.Действительно:
?- first(X).
X = a.
Вы не можете append/3
две константы b
и a
вместе, вы можете добавить списки с a
и b
вместе, так:
sf(X) :- second(S), first(F), append(<b>[S]</b>, <b>[F]</b>, X).
Предикат first/1
и second/1
также слишком специфичен : если lists/1
содержит список с четырьмя элементами, то эти предикаты завершатся ошибкой, поэтому я предлагаю вамрефакторинг эти.