Пролог - нетипизированный язык? В чем разница между Prolog и языками с динамической типизацией?

Если в Прологе есть четкое различие между строками, числами, атомами, списками и составными структурами, как его можно назвать нетипизированным? И чем он отличается от языков с динамической типизацией, например, Lisp.

С какой частью определения «динамически типизированный язык» конфликтует Пролог? И с какой частью определения «нетипизированного языка» противоречит Лисп?

Любое понимание приветствуется.

Обновить

Я уже знаю, в чем разница между динамической, статической, сильной и слабой типизацией. Мой вопрос касается особого случая, которым является Prolog. Я просто хочу понять, как Prolog считается нетипизированным, хотя, похоже, он не имеет явного отличия от языков с динамической типизацией.

Здесь ссылка на то, что Prolog не типизирован http://en.wikipedia.org/wiki/Prolog#Types


person is7s    schedule 10.06.2011    source источник
comment
у вас есть ссылка на это?   -  person Vincent Ramdhanie    schedule 10.06.2011
comment
Я думаю, вы смешиваете строгую типизацию и динамическую типизацию.   -  person mikerobi    schedule 10.06.2011
comment
ссылка на что именно?   -  person is7s    schedule 10.06.2011
comment
Ссылка для тех, кто называет Prolog нетипизированным языком, была бы полезна. Противоположностью динамической типизации является не нетипизированная, а статическая типизация, то есть типы для переменных, определенные при компиляции.   -  person hardmath    schedule 10.06.2011


Ответы (2)


Пролог в основном нетипизирован в том смысле, что вы можете передать любой термин любому предикату, и, как правило, в худшем случае предикат не будет успешным. Однако арифметические предикаты, такие как is и =:=, ожидают числовых аргументов и могут взорваться, поэтому в них есть понятие типов.

Не чистые предикаты также могут ожидать объекты типа «дескриптор файла» и в противном случае взорваться.

Таким образом, называть Prolog «нетипизированным» не совсем верно.

person Nick Main    schedule 10.06.2011

Когда вы пишете предикат вроде

head([H|_], H).

вы нигде не указываете никаких типов. Вы можете позвонить head([1,2,3], X), вы можете позвонить head("foo", X) и даже можете позвонить head(1, [1,2,3]). Все они работают нормально. Последний не вызовет никаких ошибок, он просто вернет false.. Я думаю, это то, что имелось в виду под «нетипизированным».

person svick    schedule 10.06.2011
comment
+1 хороший пример ... Но достаточно ли того факта, что он возвращает false вместо выдачи ошибки, чтобы назвать его нетипизированным? - person is7s; 11.06.2011
comment
@ is7s, думаю, да. Если вы попытаетесь вызвать head(1), это вызовет ошибку, потому что у него неправильное количество аргументов, он не вернет false. false является частью нормальной функции языка, а не состоянием ошибки. - person svick; 11.06.2011
comment
@svick На самом деле пример, который вы только что привели, показывает, что у пролога есть типы, поскольку он показывает, что тип head является предикатом, который ожидает один аргумент, если он действительно нетипизирован, он должен был бы вернуть false и в этом случае. Кроме того, основной пример в вашем сообщении также можно прочитать как head - это предикат, который ожидает первый аргумент списка type, и он не определен (false), если первый аргумент не принадлежит < i> введите список. - person is7s; 11.06.2011
comment
Я совершенно убежден, что Prolog не является строго нетипизированным, как сказал Ник, я полагаю, что это где-то между динамически типизированным и нетипизированным. Его можно назвать частично типизированным - person is7s; 11.06.2011
comment
@ is7s, чтение false как undefined неверно. Встроенный предикат member возвращает false, когда вы передаете ему элемент и список, который его не содержит. Вы бы сказали, что member не определено, если второй аргумент не содержит первого аргумента? - person svick; 11.06.2011
comment
@svick, если быть более точным, я бы прочитал это как возможно undefined, поскольку в предположении закрытого мира все undefined предполагается как false: ) - person is7s; 11.06.2011
comment
Предикат false / 0 и отображение false зависят от пролога SWI. Обычный предикат в других системах Prolog, вызывающий сбой, - fail / 0, а другие системы Prolog обычно отображают Нет, когда данный запрос терпит неудачу. - person Mostowski Collapse; 11.06.2011