2015-10-14 10 views
1

Предположим, что мы имеем предикат 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 не подходят для этой цели.

+2

Прост в использовании: в дополнение к списку целей также отслеживайте переменную, чтобы вы могли легко обращаться к ней. Например, используйте пару, например 'OutputList- [some_predicate_1, ..., findall (..., ..., OutputList)]'. Затем, после 'maplist (call, Ls)' (где 'Ls' - вторая часть этой пары, то есть список целей), вы можете обратиться к' OutputList', который легко доступен в качестве первого члена пара. Это довольно общее решение для таких задач. Вам нужно только отслеживать переменные, о которых вы хотите поговорить позже. Обратите внимание на сходство таких структур с фактическими правилами Пролога, кстати! – mat

+0

Спасибо, но я не уверен, что смогу это сделать. Я должен использовать переменную Body like call (Body). Я не могу объяснить его фактические предикаты, потому что они могут быть произвольными. – Kami

+1

Независимо от того, вы все равно можете использовать пару, например 'OutputList-Body', а после' call (Body) ', вы можете обратиться к' OutputList'. Тем не менее, я настоятельно рекомендую чистое представление как * список целей *, что также указывает на ваш вопрос. В вашем вопросе «Тело» - это * список *, и вы называете эти цели, например, «maplist (call, Goals)». Это гораздо лучшее представление, потому что оно не является дефолтным. – mat

ответ

0

может быть легко, как

get_output_list(Predicates, Outputlist) :- 
    last(Predicates, findall(_,_,Outputlist)), 
    maplist(call, Predicates). 

если FindAll/3 не всегда последний, это должно работать

get_output_list(Predicates, Outputlist) :- 
    maplist(call, Predicates), 
    member(findall(_,_,Outputlist), Predicates). 

в случае их может быть больше, чем один FindAll в предикатах, размещение член/2 после того, как список карт/2 получит весь выходной список при обратном отслеживании

+0

Спасибо, но я не могу сделать предположение, что результат всегда задается в качестве последнего предложения. – Kami

+0

Еще раз спасибо. Почти, результат не связан с тем, что он находится в поиске, но он всегда является вторым параметром главы правила p/2. Я мог бы получить это с предложением/2, но я не знаю, как связать его с OutputList после того, как я выполнил все предикаты в теле (также у меня есть Тело как переменная, оно не связано с его фактическими предикатами, потому что они могут отличаются, и я не могу заранее предсказать структуру). – Kami

+0

пункт/2 не кажется действительно подходящим ... возможно, вам следует уточнить, чего вы ожидаете. Кажется, не соответствует вашему вопросу. – CapelliC

 Смежные вопросы

  • Нет связанных вопросов^_^