Prolog是一种无类型语言吗?Prolog和动态类型语言有什么区别?

10
如果Prolog有明确的字符串、数字、原子、列表和复合结构的区别,它怎么会被称为无类型语言呢?它与像Lisp这样的动态类型语言有何不同?
Prolog与“动态类型语言”的定义的哪个部分冲突了?Lisp与“无类型语言”的定义的哪个部分冲突了?
感谢任何见解。
更新:
我已经知道动态、静态、强类型和弱类型的区别。我的问题是关于一个特殊情况,即Prolog。我只想了解Prolog如何被认为是无类型语言,尽管它似乎与动态类型语言没有明显的区别。
这里是Prolog被认为是无类型的参考链接: http://en.wikipedia.org/wiki/Prolog#Types

你有这个的参考资料吗? - Vincent Ramdhanie
1
我认为你混淆了强类型和动态类型。 - mikerobi
参考是指确切的什么? - is7s
提供一个参考,帮助那些称Prolog为“无类型语言”的人。动态类型的相反是静态类型,即在编译时确定变量类型。 - hardmath
2个回答

4

Prolog大多数情况下是无类型的,这意味着您可以将任何类型的term传递给任何谓词,并且通常最坏的情况是谓词不会成功。然而,算术谓词(例如is=:=)需要数字参数,否则可能会失败-因此在这里有一种类型的概念。

非纯谓词也可能期望"文件句柄"类型的对象,否则可能会失败。

因此,称Prolog为"无类型"并不完全正确。


1

当你编写像这样的谓词时

head([H|_], H).

你没有在任何地方指定类型。你可以调用 head([1,2,3], X),你可以调用 head("foo", X),甚至可以调用 head(1, [1,2,3])。它们都可以正常运行。最后一个不会导致任何错误,只会返回 false。 我认为这就是“无类型”的意思。


@is7s,我认为是这样的。如果你尝试调用head(1),它会导致一个错误,因为它的参数数量不正确,而不是返回falsefalse是语言正常函数的一部分,而不是某种错误状态。 - svick
@svick实际上,您刚才给出的示例表明Prolog具有类型,因为它显示head的类型是一个谓词,该谓词期望一个参数,如果它真的是无类型的,则在这种情况下也应返回false。此外,您帖子中的主要示例也可以解读为“head是一个期望第一个参数为列表类型的谓词,并且如果第一个参数不是列表类型,则未定义(false)”。 - is7s
我相当确信Prolog不像Nick所说的那样是严格无类型的,我认为它介于动态类型和无类型之间。可以称之为部分类型化。 - is7s
@is7s,将false解读为未定义是错误的。内置谓词member在给定一个元素和一个不包含该元素的列表时返回false。如果第二个参数不包含第一个参数,你会说member是未定义的吗? - svick
@svick 嗯,更准确地说,我会把它读作“可能未定义”,因为在封闭世界的假设下,任何未定义的东西都被假定为false :) - is7s
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接