2016-04-07 8 views
1

私はカエルのパズルを解決しようとするためにプロローグを使用しています。 Iは、RとCは、私の知る限りとして行を表し、各ボックスの開始点、Lは長さを表し、Sは、行の数の合計であり、プロローグでパズルを解く - 制約付きの解を生成する?

% 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と等しくなります。私はこの問題を解決するために本当に苦労しています。これはこれです:

しかし、これはすべてfalseです。

ご協力いただければ幸いです。

+0

'Solution = length(List、L)'と 'Solution = 1..9'はどういう意味ですか? – lurker

+0

'Solution = length(List、L)'と 'Solution = 1..9'の2つの目標の組み合わせを考えてみてください。どちらも**あなたのプログラムで発生します。明らかに、この結合だけでも、「1.9」と「長さ(List、L)」が統一されていないため、すでに**失敗**となります。 – mat

+0

@ lurker、申し訳ありませんが、ソリューションins 1..9、つまり、生成された解が1から9の間でなければならないことを意味していました。 Solution = length(List、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はトリッキーなビットです - ここにあなたが欲しいの正方形をつかむと、その時点から始まるリストを作りたいです。ヒント:追加とヒントを使用します。

幸運を祈る!

関連する問題