2011-11-19 94 views
7

我一直在试图学习Prolog,并且完全沉迷于谓词s()所做的事情。 我看到它经常被使用,并且互联网上关于Prolog的资源如此之少以至于我找不到答案。s()谓词在Prolog中做什么?

Ex。

/* sum(Is,S) is true if S is the sum of the list of integers Is.   */ 
    sum([],0). 
    sum([0|Is],S):-sum(Is,S). 
    sum([s(I)|Is], s(Z)):-sum([I|Is],Z). 
+0

你使用的是什么版本的prolog解释器? –

+0

我使用:SWI-Prolog版本5.10.1 for amd64 – okin33

回答

14

s/1本身并没有做任何事情,它也不是一个真正的谓词。它们只是术语,是他们论证继承者的代表。因此,s(0)用于表示0(即1)的后继,s(s(0))用于表示s(0)的后继(即2)等等。它们在Prolog中非常普遍,因为Prolog是执行符号计算的很好的语言,但即使是简单的算术运算也感觉笨重,这意味着它们不能与编程范例无缝集成。

+8

很好地说,+ s(0)XD –

+1

这很好地解释了为什么我的程序使用s/1的输出很奇怪。非常感谢你,很好的解释! – okin33

1

s/1代表继任者。它用于以逻辑上可访问的方式表示数字。

+1

非常感谢你!但是,当我尝试运行一个使用s/1的程序计数时,我得到了以下形式的奇怪输出: ? - mycount(a,[a,a],N)。 N = s(s(0)); N = s(0); N = s(0); N = 0; 错误。 – okin33

0

这是Prolog实现特定的。它指的是后继谓词,参见this获取更多信息

+1

's(X)'不是实现特定的。这是一个任意的函子。在它的位置尝试't(X)'或'succ(X)'。 – false