問題タブ [logical-purity]
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 - プロローグの「if」?
プロローグで if を実行する方法はありますか。たとえば、変数が 0 の場合、いくつかのアクションを実行します (端末にテキストを書き込む)。else は必要ありませんが、if のドキュメントが見つかりません。
prolog - \==/2またはdif/2を使用する
2つの変数が同じ用語にインスタンス化されないようにしたい場合、それを行うための好ましい方法は何ですか?
グラフで有向エッジを見つける必要があり、ノードがそれ自体にエッジを持つことができないとしましょう。
(ここでのエッジはa-> c、b-> aですが、c-> cではありません)
次の作品:
これも機能します[swi-prolog]:
これは明らかに機能しません(AもBもまだインスタンス化されていないためですか?):
最初の解決策に関する私の問題は、より複雑なnode
述語では、失敗する前に多くの不必要な統合が行われる可能性があることだと思いedge
ます。一方dif
、ライブラリ内にあるため、このような単純なケースで使用することを意図したものではないことを示しています(ただし、私が探しているように見える正確な機能を備えています)。
prolog - 優れた Prolog コードの特徴は?
優れた Prolog を作成するためにマスターしなければならない設計ヒューリスティックは何ですか? 経験豊富なプログラマーが Prolog に習熟するには、約 2 年かかると聞きました。再帰を効果的に使用することもその一部ですが、それは比較的小さなハードルのようです。プログラマーをこれほどまでに悩ませているのは、一体何なのでしょうか? その品質を判断するには、サンプル コードで何を探す必要がありますか?
prolog - 不純なプリミティブを使用する Prolog 述語の純度
とが不純なプリミティブであることは知っていますが、それらを使用すると、それらを使用するvar/1
すべてのプログラムが不純になりますか?nonvar/1
!/0
plus/3
私は、あたかも純粋であるかのように振る舞う次の述語を書きました。述語は実証的であり、効率的に設計されていません。
2 つの質問があります。
- 上記の述語
plus/3
は本当に純粋ですか? - 一般に、特定の関係が論理的に純粋であることをどのように証明できますか?
この質問は、この回答に関する議論に続きます。
prolog - different/2 - 純粋で確定的な定義は存在するか?
member/2
andを使用したこの定義は、宣言的な観点からnon_member/2
はほぼ完全ですが、特定のクエリに対して冗長なソリューションが生成され、選択ポイントがあちこちに残されます。
これを改善する定義は何ですか (おそらく and を使用する純粋な方法if_/3
で(=)/3
) によってまったく同じソリューションのセットが記述されdifferent/2
ますが、少なくとも地上のクエリに対して決定的であり (したがって、無駄な選択ポイントを開いたままにしません)、省略します (可能であれば)冗長な答えはありますか?
1
実際、different([a|nonlist],[]), different([],[b|nonlist])
成功します。同じように失敗する可能性があります。したがって、両方で失敗する解決策は問題ありません (おそらくさらに細かいことです)。
prolog - Prologの「論理的純粋性」とは何を意味しますか?
「論理的純度」(Prolog プログラミングのコンテキストで) とはどういう意味ですか? logical-purityタグ情報には「ホーン節のみを使用するプログラム」と書かれていますが、それでは、述語はどのようにif_/3
修飾されるのでしょうか。var/1
つまり、低レベルのものです。
ある程度の「純粋な」効果が得られることはわかりますが、これは正確にはどういう意味ですか?
より具体的な例として、この回答if_/3
などで使用されている論理的に純粋であると見なされる方法を説明してください。