Мне показалось, что я понимаю, как совпадение шаблонов, найденное в Scala и Haskell, отличается от унификации, найденной в Prolog, но мои непонимания Prolog великолепны. Какие простые проблемы решаются теми, которые не могут быть решены другим? СпасибоРазличия между сопоставлением шаблонов и объединением?
ответ
Простая инструкция: сопоставление образцов в одну сторону, унификация - в одну сторону. То есть в Prolog правая часть (совпадающая с ней) может включать несвязанные переменные. Например, если у вас есть два несвязанных переменных X
и Y
, это будет работать нормально:
X = Y,
X = 5,
%% Y = 5 now as well
В Erlang (который использует шаблон-сопоставление с синтаксисом рядом с Пролога), линия X = Y
будет выдавать ошибку: variable 'Y' is unbound
. Обратите внимание, что X
является несвязанным в порядке: он должен быть сопоставлен с образцом.
Это может быть полезно, если вы хотите иметь дело с частично определенными значениями. Очень хороший пример: difference lists.
Это также позволяет использовать предикат Prolog в нескольких режимах. Например. в Scala/Haskell/Erlang, если вы хотите 1) найти A ++ B
, 2) решить уравнение A ++ X == B
или 3) решить уравнение X ++ A == B
для данных списков A
и B
, вам необходимо написать 3 отдельные функции; в Prolog все эти задания (и многое другое!) выполняются одним предикатом.
В Scala не удалось скомпилировать, так как это первая ветвь case пытается объявить переменную x
дважды.
(1, 1) match{
case (x, x) => println("equals")
case _ => println("not equals")
}
Если Scala используется объединение вместо шаблону это будет иметь успех и печать «равно», а
(1, 2) match{
case (x, x) => println("equals")
case _ => println("not equals")
}
напечатает «не равно». Это связано с тем, что унификация потерпит неудачу при попытке привязать переменную x
как к 1
, так и к 2
.
Фактически, это различие между линейным (как в Scala и Haskell) и нелинейным (как в Erlang и Mathematica) сопоставлением с образцом. –
В Прологе, вы можете добавить [3] [1,2], как это:
?- append([1,2], [3], Z).
Z = [1, 2, 3].
Аккуратная вещь об объединении является то, что вы можете использовать один и тот же код (внутреннее определение понятия «Append»), но вместо того, чтобы найти второй аргумент, необходимый для получения результата от первого аргумента:
?- append([1,2], Y, [1,2,3]).
Y = [3].
вместо кодирования, написав «это сделать, то сделать это», вы код в Прологе, говоря, что вы знаете. Пролог рассматривает факты, которые вы им даете как уравнения. Унификация позволяет использовать эти уравнения и решать любые переменные, которые вы еще не знаете значений, независимо от того, находятся они справа или слева.
Так, например, вы можете написать планировщик в Prolog, и вы можете запустить его «вперед», предоставив ему план и предсказать его результаты; или вы можете запустить его «назад», предоставив ему набор результатов и построив план. Вы можете даже запустить его в обоих направлениях сразу (если вы были осторожны в своем кодировании), указав набор целей и набор ограничений для плана, чтобы вы могли сказать «Найдите план для работы, который не включает с метро."
Я думаю, что это полезно для формализации понятия, вместо того, чтобы смотреть на определенном языке. Matching и унификация являются фундаментальные понятия, которые используются в более контекстах, чем сопоставление с образцом и пролога.
- Термин s ссылок т, тогда и только тогда происходит подмена фи таким образом, что фи (ы) = т
- термин сек объединяет с термином т, тогда и только тогда существует подстановка такая, что фи (ы) = фи (т)
Для примера рассмотрим члены s = f (Y, a) и t = f (a, X) где X, Y - переменные, a - постоянная. s не соответствует t, потому что мы не можем универсально количественно определить константу a. Однако существует унификатор для s и t: phi = {X \ a, Y \ a}
- 1. Различия между php apc и кэшем шаблонов
- 2. Различия между специализацией шаблонов и перегрузкой функций?
- 3. В чем разница между объединением и объединением?
- 4. Различия между двумя типами шаблонов списков
- 5. Различия типов шаблонов
- 6. В чем разница между объединением и объединением в mysql?
- 7. Различия между Camel и BPEL
- 8. Различия между символами {} и()?
- 9. Различия между '' и '' C
- 10. Различия между слэшами и ''
- 11. Различия между бутстрапом и ионикой
- 12. Различия между std :: is_integer и std :: is_integral?
- 13. Разница между запятой и объединением в sql
- 14. Разница между объединением сущностей и обновлением выполнения
- 15. Java regex: разница между диапазоном и объединением
- 16. Выбор между объединением и логическим состоянием
- 17. Соотношение между сопоставлением между классами таблицы Hibernate
- 18. В чем разница между фазовой корреляцией и сопоставлением шаблонов в OpenCV?
- 19. В чем разница между определенным определенным объединением и reinterpret_cast?
- 20. Различия между Rijndael и AES
- 21. Различия между губкой и тройником
- 22. Различия между DB2 и Oracle
- 23. Различия между org.apache.log4j.RollingFileAppender и org.apache.log4j.rolling.RollingFileAppender
- 24. Различия между javax.jms.ConnectionFactory и javax.jms.XAConnectionFactory
- 25. Различия между `URI` и` URI.parse`
- 26. Различия между App.Config и Web.Config?
- 27. Различия между optJSON и getJSON
- 28. Различия между туалетом и Grep
- 29. Различия между Angular.js и Angular.dart?
- 30. Различия между GSI и таблицей
Управлять вашими навыками сопоставления образцов Prolog в интерактивном редакторе SWI Prolog [SWISH] (http: //swish.swi- prolog.org/), используйте нижнее правое окно REPL. Обратите внимание, что объединение фактически предполагает введение ряда ограничений в деревья выражений (попробуйте запустить 'f (g (X, Y), H) = f (Z, g (a, [L, X, Y])), X = 12.'), он может даже обрабатывать бесконечные деревья. [Unification] (http://en.wikipedia.org/wiki/Unification_%28computer_science%29) - удивительно мощная идея, были написаны целые книги об этом смиренном алгоритме, в частности о том, как его оптимизировать, и еще есть работа делать. –
Глупости. Попробуйте унифицировать это: '? - B = X + A, B равно 3, A равно 2.' – Feofilakt
@Feofilakt," is "является односторонней привязкой. Вам нужно написать термины для чисел peano: 0, s (0), s (s (0)), ... или в зависимости от проблемы вы можете иметь состояние expccle succ (ноль, один), succ (один, два) ... В любом случае арифметика становится унифицируемой. –