タグ

ブックマーク / negation.hatenadiary.org (4)

  • Prologで遅延実行 - negationの日記

    組み込み述語で「freeze(変数, 実行部分)」という述語があるらしい。この述語は遅延実行を実現してくれる。遅延実行とは、「変数の中身が決まるまで、実行部分の実行はお預け」という機能。 これを使うと何ができるかというと、例えば ?- Y is X*2, X=1. は、「*」の計算が実行できないので、SWI-PrologならExceptionを吐く。そこで ?- freeze(X,(Y is X*2)), X=1. とすると、Xの中身に1が入るまで、(Y is X*2)の実行がサスペンドされる。そしてX=1となった後に、サスペンド部分が実行され、Y=2になるというもの。これはいい。 なお、不定変数が2つ以上はどうすんの?とか思うかもしれないが、 ?- freeze(Z,freeze(X, (Y is X*Z))), Z=2, X=3. とすれば多分できるはず。 Constraint Log

    Prologで遅延実行 - negationの日記
    suireN
    suireN 2010/10/27
    freeze
  • PrologでModuleの取り扱い(1) - negationの日記

    PrologでModuleを使っていると、Namespaceの扱いがやや面倒になります。たとえば、「data/2」というファクトを処理する述語「process_data/1」というのを、「process」と云うModuleで定義したとします。 :-module(process,[process_data/1]). process(DataName):- data(DataName,Data), writeln(Data), true. こういったModuleは他のファイルから大抵Includeされて使用されます。こんな感じで。 :-use_module(process). data(room01,hanako). data(room02,tarou). test:- process_data(X), fail. dataをすべて表示する「つもりの」プログラムですが、これはうまくいきません。

    PrologでModuleの取り扱い(1) - negationの日記
    suireN
    suireN 2010/10/24
    multifile
  • Writing style(書き方テク) - negationの日記

    しょうもないことですが、 hoge(X):- foo(X), bar(X). と言うのを、 hoge(X):- foo(X), bar(X), true. と書くようにしておけば、Emacsで書くとき、「Ctrl+k」で述語を行単位で編集しやすいです。「,」と「.」の書き換えが面倒な人へ。

    Writing style(書き方テク) - negationの日記
  • [Prolog][Tips] 美しいPrologのコードの書き方(1) - negationの日記

    Prologのコードを美しく書くにはどうしたらいいか?。少々ボリュームがあるので、根気のある人だけ読んでくださいw。でもきっとためになります。 まずPrologを書くに当たって、重要なことは「引数の性質が何であるか」と言うことです。 Prologの引数には3つの性質があります。 定数としての引数。これはhoge(+bar)とSWI-Prologのhelpに書かれています。 処理した後に値を返すための引数。hoge(-bar)。 上記どちらでも良い引数。hoge(?bar)。 たとえば、times(X,Y,Z)という述語を考えてみます。これは「X*Y=Z」という意味としましょう。このコードは以下のようになります。 times(X,Y,Z):- Z is X * Y. あ、「`*’使ってたら意味ないじゃん」というつっこみは無しでw。例ですからw。このときもし ?- times(X,Y,3).

    [Prolog][Tips] 美しいPrologのコードの書き方(1) - negationの日記
  • 1