2011-06-10 77 views
9

如果Prolog在字符串,数字,原子,列表和复合结构之间有明确的区别,它如何被称为无类型。 它与动态类型语言(如Lisp)有什么不同?Prolog是一种无类型的语言吗? Prolog和动态类型语言有什么区别?

“动态类型语言”的定义中的哪一部分与Prolog冲突? Lisp与“无类型语言”的定义有哪些冲突?

任何洞察力是赞赏。

更新

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

这里有一个参考这Prolog是类型化 http://en.wikipedia.org/wiki/Prolog#Types

+0

你有这个参考吗? – 2011-06-10 18:06:04

+1

我是你混合了强大的打字和动态打字。 – mikerobi 2011-06-10 18:07:39

+0

究竟是什么参考? – is7s 2011-06-10 18:08:01

回答

5

从某种意义上讲,Prolog基本上是无类型的,您可以将任何类型的术语传递给任何谓词,通常最糟糕的情况是谓词不会成功。但是,算术谓词,如is=:=需要数字参数,并且可能会爆炸 - 因此存在类型的概念。

非纯谓词也可能期望类型为“文件句柄”的对象,否则就爆发。

因此,调用Prolog“untyped”并不严格。

1

当你写这样

head([H|_], H). 

谓词时,不要在任何地方指定任何类型。你可以拨打电话head([1,2,3], X),你可以拨打head("foo", X),你甚至可以拨打head(1, [1,2,3])。他们都运行得很好。最后一个不会导致任何错误,它只会返回false.。我认为这就是“无类型”的含义。

+0

+1个很好的例子......但是它返回false而不是发出一个足以称之为“无类型”的错误的事实? – is7s 2011-06-10 20:17:12

+0

@ is7s,我认为它确实。如果你试图调用'head(1)',它会导致一个错误,因为它有错误的参数计数,它不会返回'false'。 'false'是语言正常功能的一部分,不是一些错误状态。 – svick 2011-06-10 20:32:38

+0

@svick其实你刚刚给出的例子显示了prolog有类型,因为它表明,'head'类型是一个期望一个参数的谓词,如果它真的是无类型的,它在这种情况下也应该返回false。此外,你的文章中的主要例子也可以被理解为:“head”是一个谓词,它需要_type_ list的第一个参数,如果第一个参数不是_type_列表的任何东西,它就是undefined('false')。 – is7s 2011-06-10 21:22:24