我有一个如下的子句:
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/