Разница между сопоставлением с образцом, как в Haskell, и объединением Пролога проистекает из принципиально разной роли переменных в обоих языках.
В Haskell переменные содержат значения.Конкретные ценности.Такое значение, возможно, еще не было вычислено , но , и даже может быть равно ⊥, но в противном случае это одно конкретное значение.В Haskell вы не можете взять переменную и сначала указать только некоторые свойства ее значения.
Таким образом, сопоставление с образцом всегда означает, что конкретное значение сопоставляется с образцом, который содержит некоторые переменные.Результатом такого сопоставления является либо сбой, либо привязка переменных к конкретным значениям.В Haskell это еще более ограничено, чтобы избежать необходимости общего сравнения, которое подразумевало бы, что класс Eq
определен для сопоставляемых терминов.
В Prolog, однако, переменные могут относиться к набору возможных решений,Переменные могут встречаться где угодно - также где-то между другими значениями.Объединение теперь гарантирует, что заявленные равенства все еще сохраняются, и результат представлен оптимально, то есть вычисляется наиболее общий объединитель.
| ?- <b>length(L,5).</b>
L = [_,_,_,_,_]
| ?- <b>length(L,5), maplist(=(E),L).</b>
L = [E,E,E,E,E]
Таким образом, Пролог не отвечает здесь с конкретными значениями, такими как L = [1,1,1,1,1]
или L = [[],[],[],[],[]]
но дает наиболее общий объединитель в качестве ответа, который содержит все эти конкретные значения.