Предикат functor определен таким образом, что functor(T,F,N) означает, что Т - это структура с функтором (именем структуры) F, имеющая N аргументов. Этот предикат можно использовать двумя основными способами.
Определение имени структуры и числа ее аргументов. В первом случае аргумент Т уже имеет значение. Целевое утверждение считается несогласованным с базой знаний, если Т не является ни атомом, ни структурой. Если Т - это атом или структура, то F сопоставляется с функтором этой структуры, а N присваивается значение, равное числу аргументов структуры. Заметим, что атом - это структура с числом аргументов 0. Ниже приведено несколько примеров целевых утверждений с предикатом functor:
?- functor('сумма'(3,6,Z),F,N).
Z=_23 F='сумма' N=3
?- functor(a+g,F,N).
F=+ N=2
?- functor([a,b,p],F,N).
F='.' N=2
?- functor('артист',F,N).
F='артист' N=0
?- functor([1,4,8],1,Z).
no
Создание структуры с заданным именем и заданным числом аргументов. Второй способ использования предиката functor состоит в том, что первый аргумент целевого утверждения functor(T,F,N) представляет собой не конкретизированную переменную, а два других конкретизированы. Это условие должно обязательно выполниться, однозначно определяя функтор и число аргументов соответственно. Целевое утверждение такого вида всегда согласуется с базой данных, и в результате значением Т становится структура с указанным функтором и числом аргументов. Таким образом, это некоторый способ создания произвольных структур по заданному функтору структуры и числу ее аргументов. Аргументами такой структуры, созданной с помощью предиката functor, являются не конкретизированные переменные. Следовательно, эта структура будет сопоставима с любой другой структурой, имеющей тот же функтор и одинаковое число аргументов.
Предикат functor используется для создания структуры в основном тогда, когда нам надо получить "копию" некоторой уже существующей структуры с новыми переменными в качестве аргументов. Мы можем ввести для этого предикат 'копирование', использующий functor как целевое утверждение:
/* определение функтора F и числа аргументов N */
'копирование'(STARAI,NOVAI):-functor(STARAI,F,N),
functor(NOVAI,F,N).
/* построение копии структуры */
?- 'копирование' ('предложение'('участник'(Х),'игра'(Z)),Z1).
Z1='предложение'(_23,_24).
|