![](/img/trans.png)
[英]Simple Constraint Logic Programming sample CLP(Q) gives error in Prolog
[英]CLP Prolog - Logic Programming
我们有一个列表列表,想想一个例子?- 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]
,则只有X
为零时, solveOne
成功; solveOne
只有X
为零时, solveOne
才能成功。 否则,它会根据sum([],0)
失败。 因此,从某种意义上说,如果您假设总和始终严格为正,则可以间接检查至少可以有一个变量。
为了明确检查是否至少有一个变量,可以按如下所示修改solveOne
:
solveOne([Const,V1|Vars]) :-
sum([V1|Vars], Const).
@coredump答案将使您步入正轨。 如果您对编写精益代码感兴趣,请考虑这个更简洁的定义(在SWI-Prolog中测试)
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.
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.