Nuestro grupo de redactores ha estado horas buscando la resolución a tus dudas, te compartimos la soluciones así que deseamos serte de gran apoyo.
Solución:
No obstante, creo que la respuesta anterior merece algunas palabras de explicación aquí.
Una breve nota por adelantado: las expresiones aritméticas en Prolog son solo términos (“Todo es un término en Prolog”), que no se evalúan automáticamente. (Si tiene experiencia en Lisp, piense en listas citadas). Entonces 3 + 4
es lo mismo que +(3,4)
, que no hace nada por sí solo. Es responsabilidad de los predicados individuales evaluar esos términos.
Varios predicados incorporados realizan evaluaciones implícitas, entre ellos los operadores de comparación aritmética como =:=
y is
. Tiempo =:=
evalúa ambos argumentos y compara el resultado, is
acepta y evalúa solo su Derecha argumento como una expresión aritmética.
los izquierda El argumento tiene que ser un átomo, una constante numérica (que luego se compara con el resultado de la evaluación del operando correcto) o una variable. Si es un ligado variable, su valor tiene que ser numérico y se compara con el operando derecho como en el caso anterior. Si es un desatado variable, el resultado de la evaluación del operando derecho está vinculado a esa variable. is
se utiliza a menudo en este último caso, para vincular variables.
Para retomar un ejemplo del Diccionario Prolog vinculado anteriormente: Para probar si un número N es par, puede usar ambos operadores:
0 is N mod 2 % true if N is even
0 =:= N mod 2 % dito
Pero si desea capturar el resultado de la operación, solo puede usar la primera variante. Si X no está consolidado, entonces:
X is N mod 2 % X will be 0 if N is even
X =:= N mod 2 % !will bomb with argument/instantiation error!
Regla de oro: si solo necesita una comparación aritmética, utilice =:=
. Si desea capturar el resultado de una evaluación, utilice is
.
?- 2+3 =:= 6-1.
true.
?- 2+3 is 6-1.
false.
Consulte también los documentos http://www.swi-prolog.org/pldoc/man?predicate=is/2
Complementando las respuestas existentes, me gustaría señalar algunos puntos adicionales:
Un operador es un operador
En primer lugar, el operador=:=
es, como su nombre indica, un operador. En Prolog, podemos usar el predicado current_op/3
para obtener más información sobre los operadores. Por ejemplo:
?- current_op(Prec, Type, =:=). Prec = 700, Type = xfx.
Esto significa que el operador =:=
tiene precedencia 700 y es de escribe xfx
. Esto significa que es un binario infijo operador.
Esto significa que tu pueden, si tu querer, escribe un término como =:=(X, Y)
equivalentemente como X =:= Y
. En ambos casos, los functor del término es =:=
, y el aridad del término es 2. Puede utilizar write_canonical/1
para verificar esto:
?- write_canonical(a =:= b). =:=(a,b)
Un predicado no es un operador
¡Hasta aquí todo bien! Todo esto ha sido puramente sintáctico característica. Sin embargo, lo que eres Realmente preguntando es el predicado(=:=)/2
, cuyo nombre es =:=
y que toma 2 argumentos.
Como ya han explicado otros, el predicado (=:=)/2
denota igualdad aritmética de dos expresiones aritméticas. Está truesi sus argumentos evaluar al mismo número.
Por ejemplo, intentemos la consulta más general, mediante la cual pedimos cualquier solución, utilizando variables como argumentos:
?- X =:= Y. ERROR: Arguments are not sufficiently instantiated
Por tanto, este predicado es no a true relación, ya que no podemos usarlo para generando resultados! Este es un inconveniente bastante severo de este predicado, que choca con lo que comúnmente llama “programación declarativa”.
El predicado solo funciona en el mismo específico situación en la que ambos argumentos están plenamente instanciados. Por ejemplo:
?- 1 + 2 =:= 3. true.
Llamamos a tales predicados modelado porque solo se pueden usar en particular modos de uso. Para la gran mayoría de los principiantes, los predicados modelados son una pesadilla usar, porque requieren que pienses en tus programas procedimentalmente, que es bastante difícil al principio y sigue siendo difícil también más tarde. Además, los predicados modelados severamente limitar la generalidad de sus programas, porque no puede utilizarlos en todas las direcciones en las que podría use predicados puros.
Las restricciones son una alternativa más general
Prolog también proporciona mucho mas general predicados aritméticos en forma de aritmética limitaciones.
Por ejemplo, en el caso de enteros, prueba tu sistema Prolog Restricciones de CLP (FD). Una de las restricciones CLP (FD) más importantes denota aritmética igualdad y se llama (#=)/2
. En completa analogía con (=:=)/2
, los operador(#=)/2
también se define como un infijo operador, por lo que puede escribir, por ejemplo:
| ?- 1 + 2 #= 3. yes
Estoy usando GNU Prolog como un ejemplo particular, y muchos otros sistemas Prolog también proporcionan implementaciones CLP (FD).
Una gran atracción de las limitaciones se encuentra en su generalidad. Por ejemplo, en contraste con (=:=)/2
, nos ponemos con el predicado(#=)/2
:
| ?- X + 2 #= 3. X = 1 | ?- 1 + Y #= 3. Y = 2
Y incluso podemos preguntarle al más general consulta:
| ?- X #= Y. X = _#0(0..268435455) Y = _#0(0..268435455)
Nótese con qué naturalidad estos predicados se mezclan en Prolog y actúan como relaciones entre expresiones enteras que se pueden consultar en todas las direcciones.
Dependiendo del dominio de interés, mi recomendación es utilizar CLP (FD), CLP (Q), CLP (B) etc. en lugar de de utilizar más predicados aritméticos de bajo nivel.
Consulte también clpfd, clpq y clpb para obtener más información.
Casualmente, el operador=:=
es utilizado por CLP (B) con un completamente significado diferente:
?- sat(A =:= B+1). A = 1, sat(B=:=B).
Esto muestra que debe distinguir entre operadores y predicados. En el caso anterior, el predicado sat/1
ha interpretado la expresión dada como una fórmula proposicional, y en este contexto, =:=
denota igualdad de expresiones booleanas.
Si crees que ha sido de ayuda nuestro artículo, te agradeceríamos que lo compartas con otros seniors de este modo nos ayudas a difundir esta información.