問題タブ [curry]
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 - より興味深いまたは強力なものは何ですか:カレー、マーキュリーまたはラムダ-プロローグ?
スクラッチ/リバースエンジニアから実装するのに、どの正式なシステムがより興味深いかについてお聞きしたいと思います。
論理/宣言型プログラミングシステムの既存のオープンソースプロジェクトをいくつか調べました。私は自分の自由な時間に似たようなものを作るか、少なくとも実装の一般的な考え方を理解することにしました。
これらのシステムのいくつかが、論理とその計算モデルとの関係における現代の学術調査の表現力と簡潔さのほとんどを提供するならば、それは素晴らしいことです。
少なくとも概念レベルで何を勉強することをお勧めしますか?たとえば、Lambda-Prologは、特に高次の関係を可能にするため興味深いものですが、AFAIKは直観主義論理に基づいているため、排中律の原則がありません。それは一般的に私にとって不利です。
また、あまり人気がないが、より表現力豊かで強力な最新の論理プログラミングシステムについての提案を歓迎します。
type-systems - 論理言語でのゴール停止を防ぐことができる型システムは?
カレーチュートリアルのセクション3.13.3から:
残存する操作は 剛体 と呼ばれ、縮小する操作は 柔軟 と呼ばれます。定義されたすべての演算は柔軟ですが、算術演算などのほとんどのプリミティブ演算は、推測が合理的なオプションではないため、厳密です。たとえば、プレリュードでは、リスト連結操作を次のように定義しています。
操作「++」は柔軟であるため、特定のプロパティを満たすリストを検索するために使用できます。
一方、加算「+」などの事前定義された算術演算は厳格です。したがって、論理変数を引数として「+」を呼び出すと、次のように失敗します。
カリーは、中断されるゴールを書くことを警戒しているようには見えない. 目標が中断されるかどうかを事前に検出できるのは、どのタイプのシステムですか?
list - Curryのstdlibの非決定論的選択関数が単純に定義されておらず、ヘルパー2引数関数を使用しているのはなぜですか?
「リストから1つの要素を非決定論的に選択する」という仕様のchoose
Curryプログラミング言語の関数について考えてみます。(choose xs)
xs
私はそれを2つの代替の非決定論的ルールを通して簡単に実装します:
しかし、Muenster CurryCompilerの/usr/lib/curry-0.9.11/Success.curryでは、ヘルパー関数で定義されています。
コンパイラが提供するモジュールからの定義の利点(もしあれば)は何でしょうか?2つの定義は完全に同等ですか(非決定論と未定義の値を持ついくつかのトリッキーな場合でも)?..場合によっては、そのうちの1つがより効率的ですか?
追加:より深い考察
cthom06(Thanks!)は、私の定義がはるかに多くの場合に未定義の値にヒットすることを正しく指摘しています(最初に「トップレベル」の呼び出しごとに1回、空のリスト引数を使用してこの関数を呼び出そうとするためです空でないリスト引数)。(うーん、なぜ私はこの考慮事項にすぐに気づかなかったのですか?..)それは効率が悪いです。
しかし、私は疑問に思います:意味上の違いはありますか?いくつかのトリッキーなコンテキストで違いが重要になる可能性がありますか?
2つの定義の違い(空でないリストの場合)は、基本的に、次の2つの潜在的な定義の違いに要約されますid
。
私の定義は次のように定義するようなid
ものです。
そしてそれらの定義はid
通常の方法で定義するようなものです:
(したがって、ここでは単純さが元に戻されます。)
どのような状況でそれが重要になる可能性がありますか?
recursion - "foop": 命名規則? これは、「foo」のヘルパー再帰関数です。接尾辞の「p」は何を意味しますか?
次のコード スニペット (関数定義) を見つけました。
「標準ライブラリ」の Curry プログラミング言語で --/usr/lib/curry-0.9.11/Success.curry from Muenster Curry Compiler。ここ:
と
ヘルパー再帰関数の"p" サフィックスchoosep
は既知の命名規則ですか? おそらく、関数型プログラミングの伝統 (Haskell) または論理型プログラミング (Prolog?) から来ているのでしょう。それはどういう意味ですか?
(この関数は、Why is the non-deterministic choice function in Curry's std lib not directly definedly but rather with a helper 2-argument function?で検討されました。)
console - カレーの「readline」(または「haskeline」)?
適切なライン編集を備えたコンソールUIを備えたCurryプログラミング言語でプログラムを作成する最も実用的な方法は何ですか?
実際、ユーザーの入力の提案として文字列を渡し、ユーザーにコンソールで編集させ、編集したバリアントを受け取って処理し(プロセスの現在の状態に戻す)、ループする必要があります。
私はreadlineのような/haskelineのような編集が好きです。(そして、最新バージョン(0.6.4.0)のBTW haskelineには、まさに私が望むAPIがあります。提案された初期値を持つ行を読んでください- getInputLineWithInitial
:
getInputLine
この関数は、入力領域に事前入力することを除いて、とまったく同じように動作します。入力領域にあるテキストは、2つの文字列を持つ2タプルとして指定されます。タプルの左側の文字列はカーソルの左側に表示される文字列であり、右側の文字列はカーソルの右側に表示される文字列です。
)。
最も実用的な方法でCurryプログラムに必要な機能を取得する方法(つまり、コンソール編集操作のためにCurryで新しいコードを記述したくないのですが、ライブラリ、ラッパー、またはFFIを使用する可能性があります) ?
show - Curry でのデータ型の表示
Curryには、REPL 内のデータ型を ( PAKCS または MCC を使用して) 表示またはきれいに印刷する機能がありますか? Haskell では、この機能は型 classを使用して実装されます。ただし、維持されている Curry 実装は型クラスを実装していません。PAKCS ライブラリをざっと見てみると、抽象データ型には、ユーザーが対話するための標準的な表現が与えられていないように見えますが、それらをきれいに印刷するために定義された個別の関数がいくつかあります。Show
参考までに、私は個人的なプロジェクトのためにいくつかの抽象データ型を実装しています。インタラクティブなユーザー インターフェイスを備えたコンパイル済みプログラムにコードをパッケージ化するつもりはないので、Haskell のshow
関数に近いものが便利です。
functional-programming - 関数は「Nothing」ではなく「No Solution」を返します
述語ロジックの式を表す標準データ型があります。論理和の自然演繹消去規則を表す関数は、次のようになります。
統合が失敗したときに Nothing と評価する代わりに、関数は に解を返しませんPACKS
。
何が欠けているのですか?統合が失敗したときにel
評価されないのはなぜですか?Nothing
haskell - Haskell全体がCurryの一部になりますか?
ウィキペディアでカレーを見つけました。カリーはスーパーセットに近いと言われていますが、何かが欠けているからではありません。
Haskell全体をサポートすることを望みます。彼らは、Curry の一部として Haskell を実装することを計画していましたか?
haskell - カレーコンパイラ亜鉛は設定できません
カリーズのコンパイラ亜鉛を設定すると、次のようになります。
では、IOExtsとは何ですか?どこで見つけることができますか?
logic-programming - Curry で検索スペースを制限するには?
以下は、カレーでの私の最初のプログラムです。目的のソリューションに到達するために必要な一連の手順を出力します (閉じたドアを通り抜けます)。
探しているときに終了させるにはどうすればよいImpossible
ですか? Kics2 0.3.1 を使用しています。