在下面的问题中,有没有一种方法可以表达OR条件,而不引入额外的谓词p (这是Project Euler1):
:- use_module(library(clpfd)).
p(B) :-
B in 0..1000,
( B mod 3 #= 0 ; B mod 5 #= 0 ),
indomain(B).
euler_001(A) :-
aggregate_all(sum(B), p(B), A).如果我将;放在相同的目标中:
euler_001(A) :-
B in 0..1000,
( B mod 3 #= 0 ; B mod 5 #= 0 ),
aggregate_all(sum(B), indomain(B), A).结果实际上是:
?- euler_001(R).
R = 166833 ;
R = 100500.这在直觉上是有道理的,因为;会产生回溯,所以会计算两次和,一次计算可被3整除的数字,一次计算可被5整除的数字。
发布于 2021-07-09 13:18:32
答案:
:- use_module(library(clpfd)).
euler_001(A) :-
B in 0..1000,
B mod 3 #= 0 #\/ B mod 5 #= 0,
aggregate_all(sum(B), B, A).https://stackoverflow.com/questions/68311471
复制相似问题