我有一个如下的子句:

lock_open:-
conditional_combination(X),
等于(X,[8,6,5,3,6,9]),!,
打印(X)。


此子句成功。但是我想知道在equal(X,[8,6,5,3,6,9])变为true之前调用conditional_combination()的次数。该程序将通过遵循一些规则来生成排列。我需要生成多少排列才能获得像865369这样的特定值。

最佳答案

您实际想要的是略有不同的东西:您想要计算一个目标的答案数量(到目前为止)。

以下谓词call_nth(Goal_0, Nth)call(Goal_0)一样成功,但是有一个附加参数,指示找到的答案是第n个答案。此定义高度特定于SWI或YAP。不要在常规程序中使用诸如nb_setarg/3之类的东西,而是将其用于封装良好的情况下。即使在
在这两个系统中,对于一般情况而言,这些构造的确切含义尚不明确。 Here is a definition for SICStus

call_nth(Goal_0, C) :-
   State = count(0,_), % note the extra argument which remains a variable
   Goal_0,
   arg(1, State, C1),
   C2 is C1+1,
   nb_setarg(1, State, C2),
   C = C2.

A more robust abstraction is provided by Eclipse:

call_nth(Goal_0, Nth) :-
   shelf_create(counter(0), CounterRef),
   call(Goal_0),
   shelf_inc(CounterRef, 1),
   shelf_get(CounterRef, 1, Nth).


?-call_nth(介于(1,5,I),Nth之间)。
I = Nth,Nth = 1;
I = Nth,Nth = 2;
I = Nth,Nth = 3;
I = Nth,Nth = 4;
I = Nth,Nth = 5。


因此,只需将其包装:

lock_open:-
call_nth(conditional_combination(X),Nth),
X = [8,6,5,3,6,9],
!,
....

关于recursion - 计算子句的调用次数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11364634/

10-12 22:31