2011-09-07 14 views
5

Al resolver problemas en una tarea más grande para la escuela, encontré un error que había cometido, donde trataba una sola lista de elementos (una pila con un artículo) como si fuera un solo artículo. He resuelto mi problema, sin embargo, en la prueba adicional noté algo raro:Prólogo: artículo único frente a lista de elementos individuales

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' 

comportamiento similar ocurre usando =: =/2 en lugar de decir/2. Por cualquier razón, una sola lista de elementos se considera igual que un solo elemento, pero solo para enteros no negativos.

Curiosidad más que cualquier otra cosa ... ¿Alguien sabe por qué es esto?

Gracias!

Respuesta

4

En SWI-Prolog (y quizás otros), esto está relacionado con un backward compatibility implementation de expresiones para la evaluación por is/2 y =:=/2:

.(+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. 

Como los códigos de caracteres son números enteros no negativos, esto puede explicar por qué el comportamiento que Solo estoy viendo trabajos para tales números y no números flotantes y negativos.

+0

Gracias! Esa parece ser la respuesta, ya que "97 es [a]". es verdad. Sin embargo, tal vez soy un idiota, pero realmente no puedo entender exactamente lo que se describe en esa página de manual. Los predicados enumerados (mínimo, máximo, abs, etc.) no parecen existir para mí, y no entiendo por qué todos los argumentos tienen + signos al frente. Y no entiendo por qué el predicado relacionado con esta Q es solo un punto con dos argumentos, no estoy usando nada de eso. – The111

+2

Esa página es sobre SWI-Prolog; tal vez su implementación no es compatible con min, max, etc.? Algunos argumentos están precedidos por '+' ya que esto indica el modo, es decir, '+' significa vinculado (y no variable). Por último, la sintaxis de lista '[a, b]' es una abreviatura para el predicador constructor de la lista './2' (por lo que en realidad es'. (A,. (B, [])) '). En su caso, una lista de un solo entero como '[1]' es una abreviatura para '. (1, [])'. – sharky

+0

Ok, grandes explicaciones ... Creo que lo tengo ahora. Gracias de nuevo. – The111

Cuestiones relacionadas