Предикат functor определен таким образом, что functor(T,F,N) означает, что Т – это структура с функтором F , имеющим N аргументов. Этот предикат можно использовать двумя основными способами, В первом случае аргумент Т уже имеет значение. Целевое утверждение считается несогласованным с базой данных, если Т не является ни атомом, ни структурой. Если Т – это атом или структура, то F сопоставляется с функтором этой структуры, а N присваивается значение, равное числу аргументов функтора. Заметим, что в данном контексте считается, что атом – это структура с числом аргументов 0. Ниже приведено несколько примеров целевых утверждений с предикатом functor:
?- functor(f(a,b,g(Z)),F,N).
Z = _23, F = f , N = 3
?- functor(a+b,F,N).
F = +, N = 2
?- functor([a,b,c],F,N).
F =., N = 2
?- functor(apple,F,N).
F = apple, N = 0
?- functor([a,b,c],'.',3).
нет
?- functor([a,b,c],a,Z).
нет
Прежде чем перейти к обсуждению предиката arg, следует рассмотреть второй способ использования предиката functor. В этом случае первый аргумент целевого утверждения functor (Т, F, N) неконкретизирован. В этом случае два других аргумента должны быть конкретизированы, однозначно определяя функтор и число аргументов соответственно. Целевое утверждение такого вида всегда согласуется с базой данных, и в результате значением Т становится структура с указанными функтором и числом аргументов. Таким образом, это некоторый способ создания произвольных структур по заданным функтору структуры и числу ее аргументов. Аргументами такой структуры, созданной с помощью предиката functor, являются неконкретизированные переменные. Следовательно, эта структура будет сопоставима с любой другой структурой, имеющей тот же функтор и одинаковое число аргументов.
Предикат functor используется для создания структуры в основном тогда, когда нам надо получить «копию» некоторой уже существующей структуры с новыми переменными в качестве аргументов. Мы можем ввести для этого предикат копирование, использующий functor как целевое утверждение:
копирование(Старая, Новая):- functor(Cтapaя,F,N), functor(Hoвaя,F,N).
В этом определении подряд используются два целевых утверждения functor. Если целевое утверждение копирование имеет конкретизированный первый аргумент и неконкретизированный второй, то произойдет следующее. Первое целевое утверждение functor будет соответствовать первому способу использования этого предиката (так как первый аргумент этого предиката конкретизирован). Следовательно, F и N конкретизируются, получив в качестве значений функтор и число аргументов этой существующей структуры. Второе целевое утверждение functor соответствует второму способу использования этого предиката. На этот раз первый аргумент неконкретизирован, и информация, задаваемая F и N , используется для создания структуры Новая. Эта структура имеет те же функтор и число аргументов, что и Старая, но ее компонентами являются переменные. Таким образом, возможен следующий диалог:
?- копирование(sentence(np(n(john)), v(eats)),X).
X = sentence(_23,_24)
Мы используем подобную комбинацию целевых утверждений functor в определении предиката reconsult в разд. 7.13.
|