問題タブ [swi-prolog-for-sharing]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
1 に答える
240 参照

list - リスト内の2つの値の間のアイテムのリストを抽出する - プロローグ

ランダムな順序で 1 から 9 までの値の長さ 9 の一意のリストがあり (数独を考えてください)、値 1 から 9 (排他的) の間で発生するアイテムのサブリストを抽出したいとします。 . IE:between1and9([1,3,5,4,2,9,7,8,6],[3,5,4,2])真であるべきです。

現時点では を使用しようとしていますflatten/2が、あまり運がありません。これが私の現在の戦術です(List ins 1..9, maplist(all_distinct, List), length(List, 9)ここで整頓/懸念の分離を維持するために他の場所で強制すると仮定します):

ただし、1 または 9 が の最初または最後の位置にListある場合、または 内で隣接している場合、このバージョンは失敗しますListbetween1and9([_,1,9,_,_,_,_,_,_],[])は true ですが、between1and9([_,1,9,_,_,_,_,_,_],_)false です (より大きな問題を解決するための制約として使用しようとすると失敗します)。

両方の失敗の原因となっているのは同じ問題のflattenようです。どこかで明示されていない限り、未知のものを空のリストとして扱うのは好きではないようです。

flatten最初の引数で空のリストを「発明」できれば、それは最初の引数のすべての解の無限のセットを意味する可能性がある理由がわかります。私の完全なプログラムには、これを防ぐための他の制約がありますが、flattenそれを受け入れたくない理由は理解できます。

すべての順列を選言と一致させることで、エッジ ケース (しゃれを意図したもの) を説明できます (つまりflatten([_,1,B,9,_],L);flatten([_,9,B,1,_],L);flatten([_,1,B,9]);flatten...:\*above permutations on flatten*\; ( Between = [], (\*permutations for either edge and 1/9*\) )

しかし、それはすでに長々とした解決策 (合計で 10 回のフラット化の順列) をさらに悪化させているようです (18) ので、2 つの (強く関連する) 質問があります。

  1. 次のことができれば:

    match for の各順列を手動で入力する必要はありませんflatten。残念ながら、これといくつかのバリエーションはすべて一方的に失敗します。ここで明らかな何かが欠けていますか?(演算子の優先順位を疑っていますが、いくつかの異なるバージョンを試しました。)

  2. それとも私はこれを完全に間違っていますか?flatten/2ドキュメントは、ほとんどの場合、それはアンチパターンであることを示唆しています.この問題を解決するためのよりプロローグっぽい*方法はありますか? これを経験するにつれて私が気付いているすべての落とし穴を考えると、そこにあるとほぼ確信しています.

(申し訳ありませんが、私がこれで物事を説明するために使用している多くの用語がおそらく非常に間違っていることを痛感しています.私は論理プログラミングを実際にかなりよく理解していますが、それについてしっかりと話すための言語を見つけるのに苦労しています.

いくつかの背景:私はプロローグを始めたばかりで、多くの数独ソルバーの1つを拡張して、何年も前に印刷したいくつかのパズルで見つけた奇妙な種類の数独を解決しようとすることで、私の理解をテストしています。追加のヒントとして、特定の行または列の 1 と 9 の間に表示される数字は、数独とピクロスを組み合わせたようなものです。現在のソルバーは swish: SumSudoku(swish)です。あなたがそれに到達すると混乱するかもしれませんが。

*当然の質問: 「pythonic」という単語のプロローグ バージョンはありますか?