問題タブ [implicit-state-passing]

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 投票する
2 に答える
2224 参照

prolog - グローバル (または状態) 変数を実装するために Prolog で assert とrettractall を使用しないようにする方法

Prologでは、最初に述語に格納された値を取得し、次に値を再計算し、最後にretractallandを使用して値を格納することによって、いくつかの算術計算 (またはプログラム全体で重要な状態情報) を含むコードを記述することがよくあります。assertを使用して変数に値を2回割り当てることはできませんis(したがって、変更が必要なほとんどすべての変数がグローバルになります)。これは Prolog では良い習慣ではないことがわかりました。この点について、私は次のように尋ねたいと思います。

  1. Prologでそれが悪い習慣なのはなぜですか(私自身は、一種の柔軟な(変更可能な)変数を持つためだけに上記の手順を実行するのは好きではありませんが)?

  2. この慣行を回避する一般的な方法にはどのようなものがありますか? 小さな例は大歓迎です。

PS Prologの学習を始めたばかりです。C言語などのプログラミング経験があります。

さらに明確にするために編集

私が言いたいことの悪い例 (win-prolog) を以下に示します。

次に、次のようにクエリできます。

ここでは、非常に些細なことですが、実際のプログラムやアプリケーションでは、上記のグローバル変数の方法は避けられません。...のような上記のリストassert(value(0))が非常に長くなり、より多くの変数を定義するためのアサート述語がさらに多くなることがあります。これは、異なる関数間の値の通信を可能にし、プログラムの実行中に変数の状態を保存するために行われます。

最後に、もう 1 つ知りたいことがあります。回避するためにさまざまな解決策が提案されているにもかかわらず、上記の慣行が避けられなくなるのはいつですか。

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

algorithm - アルゴリズムの DCG 状態の実装

長いシーケンスと短いシーケンスの間の距離は、短いシーケンスと短いシーケンスと同じ長さの長いシーケンスの任意のサブシーケンスとの間の最小距離です。

私が使用している距離は、マンハッタン距離だと思います。(ただし、距離関数を変更できるようにしたいので、これは重要ではありません)。

この最初のバージョンは、早期放棄のない素朴な実装を示しています。同じ長さのすべてのサブシーケンスを生成し、これらをマップしてそれらと短いシーケンスの間の距離を見つけ、aggregate/3 を使用して最小値を見つけます。

クエリの例:

この次のバージョンは、長いシーケンスのサブシーケンスと短いシーケンスの間の距離が既に見つかった最小値を超えると計算を中止するため、より効率的である必要があります。

クエリ:

しかし、これではアサートとリトラクトを使用しているので、同じアルゴリズムを実行するバージョンが必要ですが、これらはありません。セミコンテキスト表記のdcgでこれを行うことができるはずだと思いますが、把握するのが難しいと思います...バックトラックによって生成しているサブシーケンスを追跡し、同時に最小距離の「状態」を追跡するにはどうすればよいですか今まで見つかった?

私が抱えている問題.. seq_subseq/2 は、バックトラッキングによってサブシーケンスを生成しています。テストされる最初のサブシーケンスは、最小距離に設定する必要があります。次にループしたいので、トラックに戻って別のシーケンスを生成します。しかし、後戻りするには失敗しなければなりません。しかし、次のシーケンスを確認するために、これまでの最小距離を戻すことはできません。

バックトラッキングを使いたくない場合は、サブシーケンスを順番に生成するための状態遷移述語を定義する必要があると思います。

この時点で

だから私は関係を定義する必要があると思います:

それは次のように機能します:

しかし、私はこれを効率的な方法で行う必要があります。

更新- Mat からの回答のおかげで、私はこれを手に入れました。これは大きな改善だと思います。誰でもこれに対するさらなる改善を見ることができますか? 私は二重にネストされた -> 構造と ! accumate_dis/4 の定義では、どちらも醜く見えます。また、短いシーケンスから最短距離である長いシーケンスのサブシーケンスを返すようにしました。

非整数で動作する必要があるため、clpfdは適切ではないと思います。

クエリ: