Nial (de "Nested Interactive Array Language") es un lenguaje de programación de alto nivel para matrices desarrollado desde aproximadamente 1981 por Mike Jenkins de la Universidad Queen's , Kingston, Ontario , Canadá. Jenkins fue cocreador del algoritmo Jenkins-Traub .
Nial combina una notación de programación funcional para matrices, basada en una teoría de matrices desarrollada por Trenchard More, con conceptos de programación estructurada para datos numéricos, de caracteres y simbólicos.
Se utiliza con mayor frecuencia para la creación de prototipos y la inteligencia artificial .
Q'Nial
[ 1 ] En 1982, Jenkins fundó una empresa (Nial Systems Ltd) para comercializar el lenguaje y la implementación Q'Nial de Nial. A partir de 2014, el sitio web de la empresa respalda un proyecto de código abierto para el software Q'Nial, con el binario y el código fuente disponibles para su descarga. Su licencia se deriva dela Licencia Artística 1.0, siendo las únicas diferencias el preámbulo, la definición de "Titular de los derechos de autor" (que cambia de "quienquiera que esté nombrado en los derechos de autor del paquete" a "NIAL Systems Limited") y una instancia de "quienquiera" (que cambia a "quienquiera").
Conceptos de Nial
Nial utiliza una Teoría de Arreglos generalizada y expresiva en su Versión 4, pero sacrificó parte de la generalidad del modelo funcional y modificó la Teoría de Arreglos en la Versión 6. Actualmente, solo está disponible la Versión 6.
Nial define todos sus tipos de datos como matrices rectangulares anidadas. Los enteros, booleanos, caracteres, etc., se consideran una matriz individual o una matriz con un solo elemento. Las matrices pueden contener otras matrices para formar estructuras de profundidad arbitraria. Nial también proporciona registros, que se definen como estructuras de matriz no homogéneas.
En Nial, las funciones se denominan operaciones. Según el manual de Nial: "Una operación es un objeto funcional que recibe un array de argumentos y devuelve un array de resultados. El proceso de ejecutar una operación pasándole un valor de argumento se denomina llamada a operación o aplicación de operación".
Aplicación de operaciones
Nial, al igual que otros lenguajes derivados de APL, permite la unificación de operadores y operaciones binarias. Por lo tanto, las siguientes notaciones tienen el mismo significado. Nota: sumes lo mismo que+
Operación binaria:
2 + 3 2 suma 3
Notación de matriz:
+ [2,3] suma [2,3]
Notación de hebra:
+ 2 3 suma 2 3
Notación agrupada:
+ (2 3) suma (2 3)
Nial también utiliza transformadores, que son funciones de orden superior. Estos utilizan la operación de argumento para construir una nueva operación modificada.
El transformador f (ff) es dos veces dos descansos [4, 5, 6, 7, 8] |6 7 8
Atlas
[ 2 ] En Nial, un atlas es una operación compuesta por una matriz de operaciones componentes. Cuando se aplica un atlas a un valor, cada elemento del atlas se aplica sucesivamente a dicho valor para obtener un resultado. Esto se utiliza para proporcionar definiciones sin variables. También lo utilizan los transformadores. En los ejemplos siguientes, 'inner [+,*]', la lista '[+,*]' es un atlas.
Ejemplos
Creación de matrices
recuento 6 1 2 3 4 5 6
Los arreglos también pueden ser literales.
Arr := [5, 6, 7, 8, 9] 5 6 7 8 9
La forma define las dimensiones de la matriz y la función de remodelación se puede utilizar para modificar dichas dimensiones.
forma Arr |5
a := 2 3 remodelar Arr # reshape es una operación binaria con dos argumentos. También se puede escribir en prefijo como # a := remodelar [[2,3], Arr] |5 6 7 |8 9 5
b := 3 2 remodelar Arr |5 6 |7 8 |9 5
un interior[+,*] b |130 113 |148 145Calcular un promedio
Las definiciones tienen el formato ' < nombre > es < expresión > '
El promedio es / [suma, recuento] promedio Arr |7.
Calcular un factorial
El hecho es recur [ 0 =, 1 primero, pasar, producto, -1 +] hecho 4 |24
Invertir una matriz
rev es remodelar [ forma, a través de [pasar, pasar, añadir converso ] ] rev [1, 2, 3, 4] |4 3 2 1
Generación de números primos
Contraste con APL
primos es sublista [ cada (2 = suma cada derecha (0 = mod) [pass,count]), pass ] resto count primos 10 |2 3 5 7
Explicación
Comprobando la divisibilidad de A por B is_divisible es 0 = mod [A,B]
Definición del filtro is_prime
is_prime es 2 = suma cada derecha is_divisible [pass,count]
Count genera un array [1..N] y pass es N (operación de identidad). eachright aplica is_divisible (pass, elemento) a cada elemento del array generado por count. De esta forma, transforma el array generado por count en un array donde los números que dividen a N se reemplazan por '1' y los demás por '0'. Por lo tanto, si el número N es primo, la suma [del array transformado] debe ser 2 (el propio array más 1).
Ahora solo queda generar otra matriz usando el contador N, y filtrar todos los que no sean primos.
primes es una sublista [cada is_prime, pass] resto count
Ordenación rápida
linkune sus matrices de argumentossublist[A,B] devuelve una lista de elementos de B elegidos de acuerdo con la lista de booleanos dada en A, seleccionando aquellos elementos de B donde el elemento correspondiente de A es verdadero.- En un
Fork[A,B,C] X, la primera A es un predicado, y si A(X) es verdadero, entonces se devuelve B(X), de lo contrario se devuelve C(X). Passes una operación de identidad para matrices.
quicksort es fork [ >= [1 first,tally], aprobar, enlace [ sublista quicksort [ < [pass, first], pass ], sublista [ coincidencia [pass,first],pass ], sublista quicksort [ > [pass,first], pass ] ] ]
Cómo usarlo:
ordenamiento rápido [5, 8, 7, 4, 3] 3 4 5 7 8
Referencias
- lenguajes de programación de matrices