你不需要那么多!/0
:Prolog 通常可以看出您的谓词是确定性的。
让我首先提供您的代码的以下版本。它使用更具相关性的名称,不包含!/0
并使用高阶谓词来使代码更短。
:- use_module(library(clpfd)).
bartenders_cocktails_variables(Bs, Cs, Vs) :-
length(Bs, LBs),
maplist(bartenders_cocktail_variable(Bs, LBs), Cs, Vs).
bartenders_cocktail_variable(Bs, N, C, V) :-
V in 1..N,
foldl(compatible_bartender(C,V), Bs, 1, _).
compatible_bartender(C, V, Cs, N0, N1) :-
( member(C, Cs) -> true
; V #\= N0
),
N1 #= N0 + 1.
请注意,我是向上计数而不是向下计数来枚举调酒师(这只是他们能够混合的鸡尾酒的列表),因为这看起来更自然。我也可以省略一个(\+)/1
只需切换 if-then-else 的分支即可。
示例查询,显示谓词在此用例中是确定性的:
?- bartenders_cocktails_variables([[a,b],[a,b],[x,y]], [x,a,b], Vars).
Vars = [3, _G1098, _G1101],
_G1098 in 1..2,
_G1101 in 1..2.
我们看到: 鸡尾酒x
必须由第三位调酒师等混合。
我认为你的程序的这一部分可能not对您所描述的缓慢性能负责。也许你的程序的其他部分(无意中)不是确定性的?也许尝试不同的标签策略或其他限制?如果您发布更多背景信息,我们也许能够为您提供更多帮助。