Как работает подписка?

На этом первом рисунке я получаю первый элемент массива, используя:

subscript(array,[1],First)

возвращает_один

На этом втором рисунке я пытаюсь сделать то же самое, но затем для второго элемента, но он получает все от второго элемента до конца массива. Я просто хочу второй элемент, а не остальные.

returns_rest

Как именно работает индекс?


person Stanko    schedule 18.05.2016    source источник
comment
Я мало что знаю о ECLiPSe, но похоже, что все сводится к тому, какую терминологическую структуру он видит для [1, 9, ...]. Тот факт, что [2] дает конец списка, подразумевает для меня, что структура похожа на член списка Пролога, '.'(H, T), который представлен синтаксисом [H|T] в Прологе. Таким образом, [2] (что дает второй аргумент термина) дает T. Просто мысль...   -  person lurker    schedule 18.05.2016


Ответы (1)


Как говорит @lurker в своем комментарии, вы пытаетесь применить subscript/3 к списку, но он ожидает массив или любую другую плоскую структуру.

По соглашению ECLiPSe использует структуры с функтором '[]'/N для массивов. Вы можете создать их либо написав буквально

Array = [](5,Y,Z,9,2)

или создав их с помощью dim/2

dim(Array, [5])

или преобразовав их из списка

array_list(Array, [5,Y,Z,9,2])

На таких массивах subscript/3 работает как положено:

?- Array = [](5,X,Z,9,2), subscript(Array,[4],Elem).
Elem = 9
Yes (0.00s cpu)

Обратите внимание, что subscript/3 вызывается неявно, когда вы используете нотацию массива внутри арифметического выражения:

?- Array = [](5,X,Z,9,2), Result is Array[4] + 1.
Result = 10
Yes (0.00s cpu)
person jschimpf    schedule 20.05.2016