Предположим, что мы имеем предикат p/2
, что делает что-то похожее на это:Получить выход из тела, выполняемой с вызовом в Прологе
p('an atom', OutputList) :-
some_predicate_1,
some_predicate_2,
...
findall(...,...,OutputList).
p/2
делает что-то arbitrarly комплекс и в конце концов поставил какой-то результат в OutputList.
Предположим, что мне нужно иметь тело предиката p/2
в виде: Body = [some_predicate_1,...,findall(...,...,OutputList)]
и я хочу его выполнить.
Если я что-то вроде call(Body)
, как я могу получить OutputList
?
Есть ли другой предикат, который я могу использовать?
Возможно, call/1
или call/2
не подходят для этой цели.
Прост в использовании: в дополнение к списку целей также отслеживайте переменную, чтобы вы могли легко обращаться к ней. Например, используйте пару, например 'OutputList- [some_predicate_1, ..., findall (..., ..., OutputList)]'. Затем, после 'maplist (call, Ls)' (где 'Ls' - вторая часть этой пары, то есть список целей), вы можете обратиться к' OutputList', который легко доступен в качестве первого члена пара. Это довольно общее решение для таких задач. Вам нужно только отслеживать переменные, о которых вы хотите поговорить позже. Обратите внимание на сходство таких структур с фактическими правилами Пролога, кстати! – mat
Спасибо, но я не уверен, что смогу это сделать. Я должен использовать переменную Body like call (Body). Я не могу объяснить его фактические предикаты, потому что они могут быть произвольными. – Kami
Независимо от того, вы все равно можете использовать пару, например 'OutputList-Body', а после' call (Body) ', вы можете обратиться к' OutputList'. Тем не менее, я настоятельно рекомендую чистое представление как * список целей *, что также указывает на ваш вопрос. В вашем вопросе «Тело» - это * список *, и вы называете эти цели, например, «maplist (call, Goals)». Это гораздо лучшее представление, потому что оно не является дефолтным. – mat