問題タブ [failure-slice]
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.
prolog - プロローグ: 障害スライスの冗長なプログラム ポイント?
私たちは、障害スライスの概念に基づいて、純粋で単調な Prolog プログラムにおける予期しない普遍的な非終了を説明するための診断ツールを実装しています。
論文「障害スライスを使用した非終了ロジック プログラムの理由のローカライズと説明false/0
」で紹介されているように、説明候補のプログラム フラグメント サイズを縮小するために (非終了を維持しながら)、いくつかのプログラム ポイントに目標が追加されます。
これまでのところ、とても良いです...だからここに私の質問があります1:
N 個の目標を持つ条項に N+1 個のプログラム ポイントがあるのはなぜですか?
または、より正確には:
なぜ N ポイントでは足りないのでしょうか? (N+1) 番目のプログラム ポイントが必要になることはありますか?
false
代わりに、懸念の述語の各使用にそれを移すことはできませんか?また、プログラムフラグメントは次のようなクエリにのみ使用されることがわかっています
?- G, false.
脚注 1:foo(bar,baz).
各事実は規則とみなされると仮定します。foo(bar,baz) :- true.
prolog - プロローグ - プロジェニター述語の実装のための 2 つの方法
述語parent/2を介して親子関係を表す一連の事実が与えられた場合、以下に示すように述語pred1/2およびpred2/2を使用して関係「祖先」(先祖) を定義するときの違いは何ですか?
prolog - グラフ内のノード間のパスとその長さを見つける
私はこの問題を解決しようとしており、すでにこの回答を読んでいますが、私の問題は、訪問したノードリストを使用した場合でも無限ループにあります。
私の2つの試みを見てみましょう:
同様の答えが得られます。つまり、
そして、Swi-Prolog IDE がフリーズします。
- 基本ケースとして何を定義すればよいですか?
訪問したノードリストと dif() を使用して統合を確実に回避したとしても、2番目の実装がループするのはなぜですか?関数名を間違えました。
length/2 の使用をなくしたいと思います。ありがとう。
編集:
したがって、最短経路の問題ソルバーで変換しやすい2番目の実装に似たものが必要な場合でも、これがよりクリーンな方法であることがわかりました。 path3/4 の最初の呼び出しから。
そして、これは 2 番目の実装パス 2 の修正版です。
prolog - Prolog 句は個別に終了しますが、一緒には終了しません
そう
動作し、終了し、
も動作し、終了します。でもなんとなく
終了しません。考えられる理由は何ですか?
debugging - コマンドライン プログラムのデバッグ
コマンド ライン ツールとして使用するプログラムがある場合、デバッグのオプションは何ですか?
例として、プログラムが次のようになっているとします。
のリストdo_stuff.pl
:
SWI-Prolog を使用すると、次のようにコンパイルできます。
そして、単に呼び出すだけで実行できます
現状では、失敗した場合、これは 1 で終了しdo_stuff/1
ます。失敗した最初の (最も早く、最も深い) ゴールを確認するにはどうすればよいですか? またはさらに良いことに、バックトレース全体ですか?たとえば、次のようにdebug
andを使用できるはずだと思いました。leash
...しかし、私が試したものは何もありませんでした。
私が持っていた唯一の中途半端なアイデアは、決定論的に成功すると予想しているが成功しないすべての述語に対してエラーをスローすることでした。これはもちろん実行可能ですが、少し過剰に思えますか?
動機
コマンド ライン ツールとして使用されるプログラムは、(通常) 1 回実行し、引数を取り、入力を読み取り、出力を書き込むことを意図しています。この場合、失敗とは何を意味するのでしょうか。私の解釈では、予期しない失敗はプログラムのエラーです。
単体テストが役立つ場合があります (述語を分離してテストします)。ただし、これは定義上、プログラマーが問題、スコープ、またはツールを理解していないために発生するエラーには役立ちません。現実的な入力でプログラムを実行するだけで、このクラスのエラーが検出されます。
上記の例で、特定のユースケースが原因do_stuff/1
で失敗し、プログラムがゼロ以外のコードで終了した場合、プログラマーはどの述語が失敗したかを判断するためにどのような選択肢があるでしょうか?
コメントにリンクされている回答は、 1つの解決策を提供します。しかし、(私が正しく理解していれば) これには、問題の述語呼び出しが見つかるまで、プログラマーが実行フローに沿って体系的にチェックする必要があります。
これはまさに私が避けたかったことです。