2010-06-28 24 views
10

¿Hay alguna manera de definir constantes en prolog?Constantes Prolog

me gustaría escribir algo como

list1 :- [1, 2, 3]. 
list2 :- [4, 5, 6]. 

predicate(L) :- append(list1, list2, L). 

El trabajo en torno a que estoy usando ahora es

list1([1, 2, 3]). 
list2([4, 5, 6]). 

predicate(L) :- 
    list1(L1), 
    list2(L2), 
    append(L1, L2, L). 

pero es un poco torpe para enlazar una variable "inútil" como esto cada vez que necesito acceder a la constante.

Otro (incluso más feo) que funciona supongo que sería incluir cpp en la cadena de construcción.

(En mi aplicación real, la lista es una LUT de grandes dimensiones utilizados en muchos lugares.)

+3

Eso no es una solución temporal. Eso se llama declaración de hechos. Usted declara el hecho de que 'list1/1' es un objetivo sucesivo si su argumento es' [1,2,3] '. No hay variables en prolog, por lo que puede suponer que cada "valor" (átomo o término) es constante y cada "variable" (nombre de valor) es constante no determinante. Cada "variable" (ej. 'L1') puede contener incluso' (1 + 2 * 3) 'y nunca será interpretada, porque ese es el término (algo como' (1+ (2 * 3)) 'y hay hecho '(7 es (1+ (2 * 3)).'). Cuando pasa 'list1' como argumento de append se interpreta como átomo. Puede definir' myappend (list1, list2, [1,2,3 , 4,5,6]). – ony

+0

'I * * uso hecho-declaración como solución alternativa para no tener constantes. – aioobe

Respuesta

11

No creo que se puede hacer eso en 'puro' Prolog (aunque algunas implementaciones pueden dejar que hagas algo cercano , por ejemplo ECLiPSe tiene estantes).

La razón es:

1) No se puede escribir cosas como

list1 :- [4, 5, 6]. 

o

list1 = [4, 5, 6]. 

Debido lado derecho y lado izquierdo son los dos motivos términos que no coinciden

2) No se puede escribir cosas como

List1 :- [4, 5, 6]. 

o

List1 = [4, 5, 6]. 

debido a que el lado izquierdo es ahora una variable, pero las variables se permiten sólo en las cabezas/organismos predicados .

Lo que podría hacer es definir un predicado múltiples opciones como:

myList([1, 2, 3]). 
myList([4, 5, 6]). 

y luego recuperar todos sus valores con bagof (o predicados similares)

predicate(L) :- 
    bagof(ML, myList(ML), MLs),   
    concat(MLs, L). 

MLs es la lista de todos los valores ML que satisfacen myList(ML) y por supuesto concat concatena una lista de listas.

+0

Estoy de acuerdo con su respuesta, y creo que el uso de términos como' tierra (p [1,2, 3]). 'o 0-Arity términos como' x.' es generalmente el camino a seguir para definir _GLOBAL_ constantes en PROLOG, y para utilizar tales términos cuando locales en la definición de los predicados, que podrían incluir algo como 'Lista1 = [ 4, 5, 6] 'como un sub-objetivo (como usted ha mencionado). – sharky

+0

no debería haber una coma al final de ststement bagof? no soy capaz de conseguir niveles máximos en una sola lista. –

+0

@PulkitVerma, suena bien, editado – Mau

2

No, no puedes hacer eso en Prolog, y definirlo a través de un predicado es lo más sensato.

O mejor, encapsula tu función de búsqueda en un predicado.

Dicho esto, si realmente desea utilizar el preprocesamiento existe term_expansion/2, pero puede hacer que su código sea ilegible y complicado si no tiene cuidado.

También podría mirar en extensiones de Prolog que incluyen la función de anotación (lenguajes lógico funcionales como Mercury). Pero estos son aún más exóticos que Prolog.