2011-09-07 30 views
5

在排查学校更大的作业时,我发现我犯了一个错误,我在那里处理单个项目列表(一个项目堆栈),就好像它是单个项目一样。我解决了我的问题,然而,在进一步的测试,我注意到一个很奇怪:序言:单个项目与单个项目列表

48 ?- 1 is [1]. 
true. 

49 ?- -1 is [-1]. 
ERROR: is/2: Type error: `character' expected, found `-1' 

50 ?- 0.66 is [0.66]. 
ERROR: is/2: Type error: `character' expected, found `0.66' 

类似的现象偏偏使用=:=/2,而不是为/ 2。因此,无论出于何种原因,单个项目列表被视为与单个项目相同,但仅限于非负整数。

好奇心比什么都重要...有人知道这是为什么吗?

谢谢!

回答

4

SWI-Prolog(也许还有其他人),这是由is/2=:=/2有关评估表达式的backward compatibility implementation

.(+Int,[]) 

A list of one element evaluates to the element. This implies "a" evaluates to 
the character code of the letter `a' (97). This option is available for 
compatibility only. It will not work if `style_check(+string)' is active as "a" 
will then be transformed into a string object. The recommended way to specify the 
character code of the letter `a' is 0'a. 

视为字符代码,都是非负整数,这可以解释为什么行为你只能看到这样的数字,而不是浮点数和负数。

+0

谢谢!这似乎是答案,因为“97是[a]”。是真的。不过,也许我是个白痴,但我无法真正理解在手册页上描述的内容。列出的谓词(最小值,最大值,绝对值等)对我来说似乎并不存在,我不明白为什么所有参数都有前面的+号。我不明白为什么与这个Q有关的谓词只是一个有两个参数的点,我没有使用类似的东西。 – The111

+2

该页面关于SWI-Prolog;也许你的实现不支持最小值,最大值等?一些参数前面加了'+',因为这表示模式,即'+'表示绑定(而不是变量)。最后,列表语法'[a,b]'是'。/ 2'列表构造函数谓词的缩写(所以实际上是'。(a,。(b,[]))'')。在你的情况下,像'[1]'这样的单个整数列表是'。(1,[])'的缩写。 – sharky

+0

好的,很好的解释......我想我现在明白了。再次感谢。 – The111