пролог передает функцию как переменную, как добавить аргументы?

У меня есть эта произвольная функция, которую мне нужно вызывать много раз с разными переменными. Кстати, это SWI-Prolog

perform(V1,V2,V3,Function,Result):-
    % 
    % do little stuf.
    %
    Function(Arg1,Arg2,Result).

Это дает синтаксическую ошибку.

Но передача функции как переменной без добавления аргументов работает нормально, как в следующем коде:

perform(Function):-
    Function.

sayHello:-
    write('hello').

:-perform(sayHello).

Итак, как добавить аргументы в переменную функцию?


person Ihmahr    schedule 12.05.2012    source источник


Ответы (1)


В частности, в SWI-Prolog вы можете использовать call . Цитирую мануал:

вызов(:Цель, +ExtraArg1, ...)

Добавьте ExtraArg1, ExtraArg2, ... к списку аргументов цели и вызовите результат. Например, call(plus(1), 2, X) вызовет plus(1, 2, X), привязав X к 3. Конструкция call/[2..] обрабатывается компилятором. Предикаты call/[2-8] определены как настоящие (мета-)предикаты и доступны для проверки с помощью current_predicate/1, predicate_property/2 и т. д. Компилятор и система выполнения обрабатывают более высокие значения арности, но предикаты не доступным для осмотра.

где плюс указывает на то, что argument must be fully instantiated to a term that satisfies the required argument type, а двоеточие указывает на то, что agument is a meta-argument (это также подразумевает "+").

person Alexander Serebrenik    schedule 12.05.2012
comment
Спецификация аргументов : и + требует объяснения новичку. :) - person Will Ness; 12.05.2012
comment
call/n теперь является частью стандарта, если я не ошибаюсь, поэтому он не относится к SWI-Prolog. - person m09; 12.05.2012
comment
1) метааргумент — это что-то вроде предиката, цели или предложения, передаваемого в качестве аргумента; 2) Я не уверен насчет стандарта, но на самом деле SWI не единственный, кто реализует call/N, он есть и в SICStus (начиная с версии 4), я не уверен в других диалектах... - person Alexander Serebrenik; 12.05.2012
comment
Режимы в SWI часто отличаются от режимов ISO. Я не вижу смысла, почему call(:Goal, +ExtraArg1) вообще должен иметь плюс. В ISO это скорее ?. Подумайте о ?- call(=(1), X). - person false; 03.07.2012