CLP Prolog-逻辑编程

CLP Prolog-逻辑编程,prolog,clpfd,Prolog,Clpfd,我们有一个列表,例如?-solve([40,a,B],[30,B],[60,a,B,C]),label([a,B,C])。将成功替换B=30,a=10和C=20。 本例的约束条件是A+B=40,A+B+C=60,通常每个变量都在0到100之间。每个列表必须以常量开头,并且至少包含一个变量 :- use_module(library(clpfd)). sum([],0). % if the list is empty. sum([X|XS

我们有一个列表,例如
?-solve([40,a,B],[30,B],[60,a,B,C]),label([a,B,C])。
将成功替换B=30,a=10和C=20。 本例的约束条件是A+B=40,A+B+C=60,通常每个变量都在0到100之间。每个列表必须以常量开头,并且至少包含一个变量

:- use_module(library(clpfd)).

sum([],0).                              % if the list is empty.
sum([X|XS],Z) :-
   sum(XS,Z1),
   X in 0..100,
   Z #= X+Z1.

solveOne([Const|Var]) :-
   sum(Var,Const). 

solve([]).                            % if the list of list is also empty
solve([First|Others]) :-
   solveOne(First),
   solve(Others).

我对基本情况、事实的想法有点怀疑。因为根据约束,每个列表必须至少包含一个变量,另一方面,我们考虑“空列表”的情况。

首先,明显的问题是:您定义了
solve/2
solve/1
谓词(
solve([],0)
)。“
,0
”可能是不需要的

除此之外,如果只有一个常量,如
[X]
,那么
solveOne
仅在
X
为零时成功;否则,它将根据
总和([],0)
失败。所以,在某种意义上,如果你假设你的和总是严格正的,你可以间接地检查你至少有一个变量

为了明确检查是否至少存在一个有效变量,您可以修改
solveOne
,如下所示:

 solveOne([Const,V1|Vars]) :-
    sum([V1|Vars], Const).

@coredump的答案应该会让你们走上正轨。如果您对编写精益代码感兴趣,请考虑此更为简洁的定义(在SWIProlog中测试)

solve(L) :- maplist(solveOne, L).
solveOne([C|Vs]) :- Vs ins 0..100, sum(Vs, #=, C).

?- solve([[40,A,B],[30,B],[60,A,B,C]]).
A = 10,
B = 30,
C = 20.