Nial
Encyclopedia
Nial is a high-level array programming
Array programming
In computer science, array programming languages generalize operations on scalars to apply transparently to vectors, matrices, and higher dimensional arrays....

 language developed from about 1981 by Mike Jenkins of Queen's University, Kingston, Ontario
Kingston, Ontario
Kingston, Ontario is a Canadian city located in Eastern Ontario where the St. Lawrence River flows out of Lake Ontario. Originally a First Nations settlement called "Katarowki," , growing European exploration in the 17th Century made it an important trading post...

, Canada
Canada
Canada is a North American country consisting of ten provinces and three territories. Located in the northern part of the continent, it extends from the Atlantic Ocean in the east to the Pacific Ocean in the west, and northward into the Arctic Ocean...

.

Nial combines a functional programming notation for arrays based on Array Theory developed by Trenchard More with structured programming concepts for numeric, character and symbolic data.

It is most often used for prototyping and artificial intelligence
Artificial intelligence
Artificial intelligence is the intelligence of machines and the branch of computer science that aims to create it. AI textbooks define the field as "the study and design of intelligent agents" where an intelligent agent is a system that perceives its environment and takes actions that maximize its...

.

In 1982, Jenkins formed a company Nial Systems Ltd to market the language and the Q'Nial implementation of Nial. As of 2006, the company website supports an Open Source project for the Q'Nial software with the binary and source available for download under the terms of an Artistic Licence
Artistic licence
Artistic licence is a colloquial term, sometimes euphemism, used to denote the distortion of fact, alteration of the conventions of grammar or language, or rewording of pre-existing text made by an artist to improve a piece of...

.

Nial Concepts

Nial uses a generalized and expressive Array Theory in its Version 4, but sacrificed some of the generality of functional model, and modified the Array Theory in the Version 6. Only Version 6 is available now.

Nial defines all its datatypes as nested rectangular arrays. ints, booleans, chars etc. are considered as a solitary array or an array containing a single member. Arrays themselves can contain other arrays to form arbitrarily deep structures. Nial also provides Records. They are defined as non-homogenous array structure.

Functions in Nial are called Operations. From Nial manual: "An operation is a functional object that is given an argument array and returns a result array. The process of executing an operation by giving it an argument value is called an operation call or an operation application."

Application of Operations

Nial like other APL derived languages allow the unification of binary operators and operations. Thus the below notations have the same meaning.
Note: sum is same as +

grouped notation

+ (2 3)
sum (2 3)

Nial also uses transformers which are higher order functions. They use the argument operation to construct a new modified operation.

twice is transformer f (f f)
twice rest [4, 5, 6, 7, 8]
|6 7 8

Atlas

An atlas in Nial is an operation made up of an array of component operations. When an atlas is applied to a value, each element of the atlas is applied in turn to the value to provide an end result. This is used to provide point free (without-variables) style of definitions. It is also used by the transformers. In the below examples 'inner [+,*]' the list '[+,*]' is an atlas.

Creating Arrays

count 6
|1 2 3 4 5 6

Arrays can also be literal
Arr := [5, 6, 7, 8, 9]
|5 6 7 8 9

Shape gives the array dimensions and reshape can be used to reshape the dimensions.
shape Arr
|5

a := 2 3 reshape Arr
# reshape is a binary operation with two arguments. It can also be written in infix as
# a := reshape ,3], Arr]
|5 6 7
|8 9 5

b := 3 2 reshape Arr
|5 6
|7 8
|9 5

a inner[+,*] b
|130 113
|148 145

Computing Average

Definitions are of the form ' is '

average is / [sum, tally]
average Arr
|7.

Reversing an array

rev is reshape [ shape, across [pass, pass, converse append ] ]
rev [1, 2, 3, 4]
|4 3 2 1

Generating Primes

Contrast with APL
APL programming language
APL is an interactive array-oriented language and integrated development environment, which is available from a number of commercial and noncommercial vendors and for most computer platforms. It is based on a mathematical notation developed by Kenneth E...


primes is sublist [ each (2 = sum eachright (0 = mod) [pass,count]), pass ] rest count
primes 10
|2 3 5 7

Explanation

Checking the divisibility of A by B
is_divisible is 0 = mod [A,B]

Defining is_prime filter
is_prime is 2 = sum eachright is_divisible [pass,count]
Count generates an array [1..N] and pass is N (identity operation).
eachright applies is_divisible(pass,element) in each element of count-generated array.
Thus this transforms the count-generated array into an array where numbers that can divide N are replaced by '1' and others by '0'. Hence if the number N is prime, sum [transformed array] must be 2 (itself and 1).

Now all that remains is to generate another array using count N, and filter all that are not prime.
primes is sublist [each is_prime, pass] rest count

QuickSort

link joins together its argument arrays

sublist [A,B] returns a list of items of B chosen according to the list of booleans given in A, selecting those items of B where the corresponding item of A is true.

In a Fork [A,B,C] X the first A is a predicate, and if A(X) is true, then B(X) is returned else C(X) is returned.

Pass is an identity operation for arrays.

quicksort is fork [ >= [1 first,tally],
pass,
link [
quicksort sublist [ < [pass, first], pass ],
sublist [ match [pass,first],pass ],
quicksort sublist [ > [pass,first], pass ]
]
]

Using it.

quicksort [5, 8, 7, 4, 3]
|3 4 5 7 8

External links

The source of this article is wikipedia, the free encyclopedia.  The text of this article is licensed under the GFDL.
 
x
OK