Prolog
Canada という小さな実装のライブラリがあります。 hex.pm Ruby でいうところの CanCanCan のような権限判定のためのライブラリなのですが、とても興味深い実装をしています。 例えば user が article を read できるか判定するとき、 can?(user, read(artic…
いつものように処理系は GNU Prolog です。 コード fib.prolog を次のように用意します。 :- dynamic(fib/2). fib(1, 1) :- !. fib(2, 1) :- !. fib(N, F) :- N1 is N - 1, N2 is N - 2, fib(N1, F1), fib(N2, F2), F is F1 + F2, asserta((fib(N, F) :- !))…
偽クフ語とはなにか。 「白と黒のとびら」第11章をご参照ください。 本当はコード上も●と○の列で表現したかったのですが、あつかいがめんどうだったので●を 1 に○を 0 に置き換えてコードしています。 処理系はいつものように GNU-Prolog です 解読器 % 偽ク…
Elixir のテストの assert は引数が一つで、一つの式を与えるのですが、左辺と右辺のそれぞれの値を把握しています。 例えば。 適当なプロジェクトを作り、 $ mix new foo $ cd foo テストをこんな風に書いて、 # test/foo_test.exs defmodule FooTest do us…
オフラインリアルタイムどう書くE14 の中で、@yancya さんが書かれたターゲットとなる矩形(配列の配列)を取り出すコードがスマートだったので、Prolog で書いてみました。 https://gist.github.com/yancya/cfdafda3a7c80866f25e17887e0c8ca1#file-main-rb-…
練習。 % span.pro :- module(span, [span/2]). span(From, From, [From]) :- !. span(From, To, [From|Span]) :- From < To, From1 is From + 1, span(From1, To, Span), !. % span-test.pro :- include(span). main :- span(1, 10, S), format("~p~n", [S]…
\x で始まり \ で終えます。末尾があることに注意。例:バックスペース(0x08)を出力しています。 $ gprolog | ?- format("~s\x08\~s~n", ["ABc", "CDE"]). ABCDE
不思議な記述を見つけました。 An object in JSON is presented as a bunch of keys and values within curly braces, in Prolog I have used a function and a KV list like so: obj([key1-value1, key2-value2, ...]). Present your terms like that and e…
Prolog でコードをたびたび書いてはいますが、実用的なプログラムを Prolog で書けたためしがないというのが正直なところです。使い所がつかめていないのがその原因。今もまだつかめているわけではないのですが、Prolog ならば自然に表現できて簡単に解ける…
これ とか これ の入力になっている (A)(BC)(DEF)のような文字列から括弧の中にある文字列を取り出したい、というのが動機。 まわせ! Bouwkamp!! 横へな2016.2.6 問題 ESM オフラインリアルタイムどう書く 拡大版 · GitHub Ruby def tokenize(s, left, right…
先日、フィボナッチ数列を求める Prolog のコードを書いたわけですが。もっとすっきりと書けることに気がつきました。 add(X, Y, Z) :- Z is (X + Y). fib(N, Fib) :- length(Fib, N), append(Fib, [_], [1|Fib2]), append(Fib2, [_], [1|Fib3]), maplist(ad…
% fib.pro :- initialization(main). add(X, Y, Z) :- Z is (X + Y). fib(N, [1,1|Fib3]) :- append(Fib1, [_], Fib2), append(Fib2, [_], Fib3), length([1,1|Fib3], N), maplist(add, [1,1|Fib1], [1|Fib2], Fib3), !. puts(N) :- format("~d~n", [N]). ma…
リスト操作は append で、だいたいどうにかなるこということがわかりました。 % 先頭の要素を取得する head(List, Head) :- append([Head], _, List). % 末尾の要素を取得する(標準装備でした) % last(List, Last) :- append(_, [Last], List). % 先頭の要…
備忘録。 Haskell operate :: [Integer] -> String -> [Integer] operate (r:l:st) "+" = (l + r):st operate (r:l:st) "-" = (l - r):st operate (r:l:st) "*" = (l * r):st operate (r:l:st) "/" = (l `div` r):st operate stack t = (read t::Integer):st…
rotate という操作があります。要素を回転させる操作です。 いろいろな場面で Prolog の強力さを目の当たりにするのですが、今回はこの rotate という操作について見ていきます。 なお rotate させるばあい、方向として右と左がありますが、考え方は同じなの…
引き続き、アンダースタンディング コンピュテーションを読んでいます。アンダースタンディング コンピュテーション ―単純な機械から不可能なプログラムまで作者: Tom Stuart,笹田耕一,笹井崇司出版社/メーカー: オライリージャパン発売日: 2014/09/18メディ…
アンダースタンディング コンピュテーションを読んでいます。アンダースタンディング コンピュテーション ―単純な機械から不可能なプログラムまで作者: Tom Stuart,笹田耕一,笹井崇司出版社/メーカー: オライリージャパン発売日: 2014/09/18メディア: 大型本…
先日Rubyで書いたものをRuby以外のメジャーどころの言語でも実装してみます。 桁上がりで1文字戻す Ruby 再掲。 def column_names(n) result = '' begin result = (n % 26 + 65).chr + result n = n / 26 - 1 end while n >= 0 result end C++ #include <string> st</string>…
「第7回オフラインリアルタイムどう書くの問題」を解いていて気がついたこと、学んだことを明日のじぶんのために、記録。 のんびり座りたい 〜 横へな 2013.2.2 いろいろ問題をコネているうちに、この問題はパタンマッチングで解けることに気がつきました。…
C++で ベクタから指定した個数の要素を持つ部分集合のベクタを生成します。 #include <vector> template<typename T> struct Combination { typedef std::vector<T> source_type; typedef std::vector<source_type> values_type; Combination(const source_type& source, int n) { std::vector<int> v(</int></source_type></t></typename></vector>…
相変わらず「どう書く」から。 今回は第3回の参考問題と本題から。 オフラインリアルタイムどう書く第三回の参考問題 / ボールカウント(野球) Y字路巡り 〜 横へな 2012.9.7 Prologで書くステートマシン 野球のボールカウントは、現在の状態があって、入力が…
Prologにハマっています。いろんな意味で。 今日も「どう書く」の過去問から。 Bit Tetris 〜 横へな 2012.7.25 前回に引き続き、ビット操作です。 今回も数値のままビット操作をする根性がなかったので、0と1からなるリストに変換して操作しています。が、…
Prologにハマっています。今日も「どう書く」の過去問から。 第2回 オフラインリアルタイムどう書くの参考問題 / 二値画像の回転 Prologでビットマップイメージを扱う。さてどうしたものか。 結局のところ。Prolog界に足を踏み入れたばかりの初級者では想像…
Prologのトレーニング中。今日も「どう書く」の過去問から。 Tick-Tack-Toe 〜 横へな 2012.7.6 今回は、条件分岐を使ってみたのですが、見事にハマりました。 gameの3番目の定義ですが、最初は次のように書いていました。 game([H|Hs], Player, Board, Resu…
Prologのトレーニングのために「どう書く」を最初から解いてみようと考えたまではよかったのですが。 第一回 オフラインリアルタイムどう書くの参考問題 - Qiita 1問目で頭から湯気が出そうになりました。 いま使っているPrologの処理系SWI-Prologのライブラ…
オフラインリアルタイムどう書く第四回の参考問題、「フカシギの通行止め」。絶対にPrologはこの問題を解くのに向いているはず…と思いつつも力量が追いつかずにそのままになっていました。 で、Prolog力をもっと身につけようとこちらのPrologのTutorialを読…
PrologとHaskellで同じ問題を解いてみました。Prologで同程度の問題を解けるくらいのプログラミングができたのは初かもしれない…。 お題は鍋谷さんが開催されている「オフラインリアルタイムどう書く」の第4回のお題を利用させてもらいました。 テトロミノ認…
前回「むずいよ」と音を上げたPrologでの挑戦。半年以上を経ての再挑戦です。今回使用したPrologの実装はSWI-Prolog。本屋で手に取った参考書がSWI-Prologで解説されていたのでそれにならった次第。 SWI-Prolog 今のスキルレベルでは数値演算以外をできそう…
読んでます。 7つの言語 7つの世界 8クイーンが解けるなら、これも解けるだろう… 「40 - 32 / 2 = 4!」数学篇 - エンジニアのソフトウェア的愛情 …と思ったまではよかったが。Prologむずいよ。 コードの中でA, B, Cの値を生成すればいいのかもしれないと…