Во многих процедурных языках (например, Python) я могу "распаковать" список и использовать его в качестве аргументов функции. Например...
def print_sum(a, b, c):
sum = a + b + c
print("The sum is %d" % sum)
print_sum(*[5, 2, 1])
Этот код напечатает: "The sum is 8
"
Вот документация по этой языковой функции.
Есть ли в Prolog аналогичная функция?
Есть ли способ воспроизвести это поведение распаковки аргументов в Прологе?
Например, я хотел бы распаковать переменную списка перед передачей ее в позвоните.
Могу ли я написать такой предикат?
assert_true(Predicate, with_args([Input])) :-
call(Predicate, Input).
% Where `Input` is somehow unpacked before being passed into `call`.
... Который я мог бы затем запросить с помощью
?- assert_true(reverse, with_args([ [1, 2, 3], [3, 2, 1] ])).
% Should be true, currently fails.
?- assert_true(succ, with_args([ 2, 3 ]).
% Should be true, currently fails.
?- assert_true(succ, with_args([ 2, 4 ]).
% Should be false, currently fails.
Примечания
Вы можете подумать, что это XY-проблема. Может быть, но не расстраивайтесь. Было бы идеально получить ответ на только заголовок моего вопроса.
Вы можете сказать мне, что я плохо подхожу к проблеме. Я знаю, что у вас хорошие намерения, но такого рода советы не помогут ответить на вопрос. Пожалуйста, обратитесь к пункту выше.
Возможно, я подхожу к Prolog со слишком процедурным мышлением. Если это так, то какое мышление поможет мне решить проблему?
Я использую SWI-Пролог.
call(foo, a, b)
это то же самое, чтоcall(foo(a, b))
иcall(foo(a), b)
. Вот почему такой вызов, какinclude(>(2), [1,2,3,4], R)
, работает. - person   schedule 03.01.2017