首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CLP Prolog -逻辑编程

CLP Prolog -逻辑编程
EN

Stack Overflow用户
提问于 2015-08-27 19:31:40
回答 2查看 240关注 0票数 2

我们有一个列表列表--认为一个示例?- 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之间。每个列表必须以常量开头,并且至少包含一个变量。

代码语言:javascript
复制
:- 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).

我对基本案例和事实的想法有点怀疑。因为每个列表必须按照约束在列表中包含一个变量,另一方面,我们考虑“空列表”的情况。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-08-28 07:35:40

首先,显而易见的问题是:定义solve/2solve/1谓词(solve([],0))。",0“可能是不需要的。

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

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

代码语言:javascript
复制
 solveOne([Const,V1|Vars]) :-
    sum([V1|Vars], Const).
票数 2
EN

Stack Overflow用户

发布于 2015-08-28 15:04:26

@coredump回答会让你走上正轨。如果您对编写精益代码感兴趣,请考虑以下更简洁的定义(在SWI中进行测试)

代码语言:javascript
复制
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.
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32257978

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档