0

私は、グリッドがあるように説明できる ntiles 問題を解決しようとしています。次に、指定されたサイズの N 個のタイルをグリッドに配置します。次のようなルールがあります。

ntiles(A/B, Grid, N, Pos1/Pos2) :-

そして、タイルを見つけることができる可能な位置を返す必要があります:

>ntiles(2/1,3,2,P).

P=[1/1,1/3]?;
P=[1/1,2/3]?;
P=[2/1,1/3]?;
P=[2/1,2/3]?;
No.

単純な再帰問題だと思いますが、なんとか解決できませんでした。最初に、位置 1/1 から始まる 1 行にのみタイルを配置しようとしました。これは、私が今のところ最前列にとどまっていることを意味します。これが実現できれば、カラムに実装しやすいと思いました。

私のコードをチェックすると、あなたは私を理解するでしょう:

ntiles(A/B, G, N, K) :-
   setof(X/Y, horizontal(A/B, G, N, X/Y), K).

horizontal(A/B, G, N, P1/P2) :-
   N > 0,
   P is A + 2,
   P =< G,
   horizontal(A/B, G, N-1, P/1).

このコードは「false」を返します。Kのリストが返ってくると思っていたのですが、どこに問題があるか分かりますか?

また、この問題を解決するための洞察を教えてもらえますか?

前もって感謝します。

4

1 に答える 1

0

多くの問題があります。

主要な点は、setof/3 を使用してすべてのソリューションを取得し、「バックトラックで生成する」という種類の目標を必要とすることですが、代わりに horizo​​ntal/4 が決定論的なリスト コンストラクターとしてコーディングされています。

その他の問題は次のとおりです。

  • horizo​​ntal/4 は、N > 0 の場合にのみ成功します。基本ケース (つまり、N0) はどうですか?
  • P1、P2 はシングルトンです。ソリューションでは何の役割も果たせません。
  • 算術演算は明示的に評価する必要があります。次に、N-1 を渡す代わりに、たとえば - を追加M is N-1し、再帰呼び出しで M を渡す必要があります。

(非常に)似た問題について私が出した答えに興味があるかもしれません。

于 2013-06-11T12:04:14.383 に答える