Rubyの魔神 このページをアンテナに追加 RSSフィード

   「Ruby」は宝石の魔神のイメージ(The Jinn of the Ruby)
   [VB] [VB6] [Android] [電子工作] [個人メモ] [仕事メモ] [アイデア] [TstLink] [開発] [CE] [LTSA] [自動化] [Qt] [OCaml] [TOOLS]
   [3Dプリンタ] [RAA] [Forge]   [機能別索引] [逆引きRuby] [マニュアル] [るびま] [標準ライブラリ] [るりまサーチ] [Try! Ruby] [PRaggerまとめ] [ピジョン・ブラッド]
   [Rubyコーディング規約] [プログラミングのオキテ] [Rubyist SNS] [TOOLBIS]
   [RubyネットワークProg] [druby] [コードなにがし] [RDocテンプレ] [Ruby/Tkサンプル]
   [WAVE] [Xperia] [github] [twitterなど] [Java] [EA] [マクロ]

2008-06-22

tiny_prolog

| 00:29 | tiny_prolog - Rubyの魔神 を含むブックマーク はてなブックマーク - tiny_prolog - Rubyの魔神 tiny_prolog - Rubyの魔神 のブックマークコメント

http://codezine.jp/a/article/aid/461.aspx?p=1

Rubyによるprologの実装で、最初の一歩

SWI-prolog

 like( taro, coffee ).

3 ?- like(taro,X).
X = coffee

これをやってみます。

taroはcoffeeが好き

から

taroが好きなのは何か?と聞きます。

require 'tiny_prolog'

like = pred 'like'

like[:taro,:coffee].si

resolve like[:taro,:X] do |env|
  puts env[:X].inspect
end

実行結果

:coffee


listから最初を取り出すfirst,残りを取り出すrest、最初に追加のadd_to_list

SWI-prologでこんな感じ。

first( [X | Y], X ).

rest( [X | Y], Y).

add_to_list( X, L, [X | L] ).

require 'tiny_prolog'

first = pred 'first'
rest = pred 'rest'
add_to_list = pred 'add_to_list'

first[cons(:A, :X),:A].si
rest[cons(:A, :X),:X].si
add_to_list[:X,:L,cons(:X,:L)].si


t = first[list(1,2,3),:X]
resolve t do |env|
  print env[t].inspect,"\n"
end
t = rest[list(1,2,3),:X]
resolve t do |env|
  print env[t].inspect,"\n"
end

t = add_to_list[4,list(1,2,3),:X]
resolve t do |env|
  print env[t].inspect,"\n"
end

結果

first[(1 2 3), 1]
rest[(1 2 3), (2 3)]
add_to_list[4, (1 2 3), (4 1 2 3)]
トラックバック - http://ruby.g.hatena.ne.jp/garyo/20080622