1

假设我们有一个谓词p/2做类似的事情:

p('an atom', OutputList) :-
  some_predicate_1,
  some_predicate_2,
  ...
  findall(...,...,OutputList).

p/2做一些任意复杂的事情,最后把一些结果放在 OutputList 中。

假设我需要将谓词的主体p/2放在一个列表中: Body = [some_predicate_1,...,findall(...,...,OutputList)]并且我想执行它。

如果我做类似的事情call(Body),我该如何检索OutputList

我可以使用其他谓词吗?

也许call/1call/2不适合这个目的。

4

1 回答 1

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).

如果 Predicates 中可能有多个 findall,将 member/2 放在 maplist/2 之后将在回溯时获得所有 Outputlist

于 2015-10-14T12:14:40.690 回答