Вы должны понимать концепцию объединения (или фактически «сопоставления», как это реализовано в Прологе). Вы не можете привязать два или более значений к одной и той же переменной. Переменные в Прологе после сопоставления сохраняли свое значение до тех пор, пока не достигли конечной цели или не потерпели неудачу где-то. После этого, если возможностей больше, переменная повторно создается с другим значением и т. Д.
Например, если я запрашиваю appList ([]), то добавление будет проверено на соответствие:
append(ListTemp,[],[])
Если ListTemp не является пустым списком, это условие не будет выполнено, потому что семантика добавления - «добавить первый аргумент вторым, оба являются списками, в результате чего третий». Рекурсивный вызов appList(ListSum)
будет называться appList([])
, поскольку ListSum ранее сопоставляется с [], что приводит к бесконечной рекурсии (к счастью, если ListTemp не [], это не будет достигнуто).
В предложении должно быть два аргумента, один из которых является исходным списком, а другой - результирующим списком. Первые два аргумента append - это ListSum и ListTemp (зависит от того, какой порядок добавления вы хотите), а третий - результирующий список. Готово, рекурсия не требуется.