2016-04-07 128 views
1

我正在使用序言来尝试解决kakuro难题。我有这样的,其中R和C分别代表行和各框的起点规则的列表,L代表长度,S是该行中的数字的总和,在prolog中解决难题 - 使用约束条件生成解决方案?

% across(R, C, L, S) 
across(2,4,2,4). 
across(2,10,2,4). 
across(3,4,4,12). 
across(3,10,2,6). 
across(4,3,2,6). 

据我可以告诉,为了解决使用约束的难题,对于每个元素L,我将不得不找到1到9之间的不同数字,这些数字在加起来时等于S.我真的很努力去解决这个问题,我有代码到目前为止是这样的:

solveAcross(Solution) :- 
    findall([R,C,L,S], across(R,C,L,S), List), 
    Solution = length(List, L), 
    Solution ins 1..9, 
    all_distinct(Solution), 
    labeling([], Solution). 

但是,所有这一切都是返回false。

任何帮助,将不胜感激。

+0

'Solution = length(List,L)'和'Solution = 1..9'是什么意思? – lurker

+0

考虑两个目标'Solution = length(List,L)'和'Solution = 1..9'的结合,**都出现在你的程序中。很显然,这个连接本身已经**失败**,因为'1..9'和'length(List,L)'不统一。 – mat

+0

@lurker,对不起,应该是解决方案1..9,这意味着生成的解决方案必须介于1和9之间。 解决方案=长度(列表,L)我认为会创建一个长度为L的空列表,但打字这一点,这似乎并不是我想要实现我的目标所要做的。 – AgarAgar

回答

0

所以首先你需要创建你的矩阵,这将最终成为你的kakuro谜题的网格。这绝对是第一步 - 如果你已经做到了,那就表示歉意。

那么你一定要做出一些规则的制约跨越:

acrossConstraints(Matrix) :- getAcross(List), applyAcross(Matrix,List). 
%this is the overall thing to call, containing two predicates you need to make 
getAcross :- findall([R,C,L,S],across(R,C,L,S),List). 
%creates a list of the across facts 
applyAcross(Matrix,[[R,C,L,S]|T]) :- acrossConstraints(R,C,L,S,M), applyAcross(Matrix,T). 
%call another rule and recurse over the list. 

acrossConstraints是有点棘手 - 在这里你想抓住你想要的平方,然后进行从该点出发的列表。提示:使用append和提示。

祝你好运!