Programming languages Prolog是非类型化语言吗?什么';Prolog和动态类型语言之间的区别是什么?

Programming languages Prolog是非类型化语言吗?什么';Prolog和动态类型语言之间的区别是什么?,programming-languages,types,lisp,prolog,dynamic-typing,Programming Languages,Types,Lisp,Prolog,Dynamic Typing,如果Prolog在字符串、数字、原子、列表和复合结构之间有明确的区别,那么它怎么能被称为非类型化的呢。 它与动态类型语言(例如Lisp)有何不同 Prolog与“动态类型语言”定义的哪一部分冲突?Lisp与“非类型化语言”定义的哪一部分相冲突 任何见解都值得赞赏 更新 我已经知道了动态、静态、强类型和弱类型之间的区别。我的问题是关于一个特例,即Prolog。我只是想了解Prolog是如何被认为是非类型化的,尽管它似乎与动态类型化语言没有明显的区别 这里有一个Prolog是非类型化的引用 当您编写

如果Prolog在字符串、数字、原子、列表和复合结构之间有明确的区别,那么它怎么能被称为非类型化的呢。 它与动态类型语言(例如Lisp)有何不同

Prolog与“动态类型语言”定义的哪一部分冲突?Lisp与“非类型化语言”定义的哪一部分相冲突

任何见解都值得赞赏

更新

我已经知道了动态、静态、强类型和弱类型之间的区别。我的问题是关于一个特例,即Prolog。我只是想了解Prolog是如何被认为是非类型化的,尽管它似乎与动态类型化语言没有明显的区别

这里有一个Prolog是非类型化的引用

当您编写类似

head([H|_], H).

您不会在任何地方指定任何类型。你可以调用
head([1,2,3],X)
,你可以调用
head(“foo”,X)
,你甚至可以调用
head(1[1,2,3])
。他们都跑得很好。最后一个不会导致任何错误,它只会返回
false.
。我认为这就是“非类型化”的意思。

Prolog基本上是非类型化的,因为您可以将任何类型的术语传递给任何谓词,通常,最糟糕的情况是谓词不会成功。但是,算术谓词,例如
=:=
需要数字参数,可能会爆炸-因此这里有类型的概念

非纯谓词也可能期望“file handle”类型的对象,否则会爆炸


因此,将Prolog称为“非类型化”并不完全正确。

您对此有参考资料吗?我认为您将强类型和动态类型混为一谈。具体的参考资料是什么?将Prolog称为“非类型化语言”的参考资料会有所帮助。动态类型的对立面不是“非类型化”,而是静态类型,即编译时确定的变量类型。+1个很好的例子……但它返回false而不是发出一个足够称之为“非类型化”的错误这一事实吗?@我想是7s。如果尝试调用
head(1)
会导致错误,因为它的参数计数错误,因此不会返回
false
false
是语言正常功能的一部分,而不是某种错误状态。@实际上,您刚才给出的示例表明prolog有类型,因为它表明
head
的类型是一个需要一个参数的谓词,如果它真的没有类型,在这种情况下也应该返回false。此外,您文章中的主要示例也可以理解为“
head
是一个谓词,它需要list类型的第一个参数,并且未定义(
false
)如果第一个参数不是类型列表中的任何参数。我确信Prolog并不像Nick所说的那样是严格非类型化的,我猜它介于动态类型和非类型化之间。它可以部分调用typed@is7s,将
false
读取为未定义是错误的。内置谓词
member
返回
false
when您给它一个项目和一个不包含它的列表。您会说
成员
未定义是第二个参数不包含第一个参数吗?