エンジニアのソフトウェア的愛情

または私は如何にして心配するのを止めてプログラムを・愛する・ようになったか

Prolog

Elixirの関数っぽい関数でない何かと、Prologの述語っぽい述語でない何か

Canada という小さな実装のライブラリがあります。 hex.pm Ruby でいうところの CanCanCan のような権限判定のためのライブラリなのですが、とても興味深い実装をしています。 例えば user が article を read できるか判定するとき、 can?(user, read(artic…

Prolog でメモをしながらフィボナッチ数を計算する

いつものように処理系は 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) :- !))…

偽クフ語解読器をPrologで書く。

偽クフ語とはなにか。 「白と黒のとびら」第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

練習。 % 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]…

Prolog で特殊文字をリテラルに書く

\x で始まり \ で終えます。末尾があることに注意。例:バックスペース(0x08)を出力しています。 $ gprolog | ?- format("~s\x08\~s~n", ["ABc", "CDE"]). ABCDE

Prolog だって Key-Value を扱いたい

不思議な記述を見つけました。 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 で書けたためしがないというのが正直なところです。使い所がつかめていないのがその原因。今もまだつかめているわけではないのですが、Prolog ならば自然に表現できて簡単に解ける…

かっこで括られたトークンを取り出す

これ とか これ の入力になっている (A)(BC)(DEF)のような文字列から括弧の中にある文字列を取り出したい、というのが動機。 まわせ! Bouwkamp!! 横へな2016.2.6 問題 ESM オフラインリアルタイムどう書く 拡大版 · GitHub Ruby def tokenize(s, left, right…

もっと気軽に Prolog でフィボナッチ数列

先日、フィボナッチ数列を求める 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…

Fibonacci numbers with Prolog

% 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…

Prolog の append がとてもユーティリティ

リスト操作は 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…

右に回す、Prologで

rotate という操作があります。要素を回転させる操作です。 いろいろな場面で Prolog の強力さを目の当たりにするのですが、今回はこの rotate という操作について見ていきます。 なお rotate させるばあい、方向として右と左がありますが、考え方は同じなの…

有限オートマトン Finite Automaton はPrologで書くと簡単だった件

引き続き、アンダースタンディング コンピュテーションを読んでいます。アンダースタンディング コンピュテーション ―単純な機械から不可能なプログラムまで作者: Tom Stuart,笹田耕一,笹井崇司出版社/メーカー: オライリージャパン発売日: 2014/09/18メディ…

修練がてら DFA をいろんな言語で書いてみた

アンダースタンディング コンピュテーションを読んでいます。アンダースタンディング コンピュテーション ―単純な機械から不可能なプログラムまで作者: 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>…

バックトラッキング、C++で、Prologも、Haskellでも

「第7回オフラインリアルタイムどう書くの問題」を解いていて気がついたこと、学んだことを明日のじぶんのために、記録。 のんびり座りたい 〜 横へな 2013.2.2 いろいろ問題をコネているうちに、この問題はパタンマッチングで解けることに気がつきました。…

組み合わせ(数学の) 〜 combination

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>…

Prologとステートマシン

相変わらず「どう書く」から。 今回は第3回の参考問題と本題から。 オフラインリアルタイムどう書く第三回の参考問題 / ボールカウント(野球) Y字路巡り 〜 横へな 2012.9.7 Prologで書くステートマシン 野球のボールカウントは、現在の状態があって、入力が…

Prologでビットテトリス

Prologにハマっています。いろんな意味で。 今日も「どう書く」の過去問から。 Bit Tetris 〜 横へな 2012.7.25 前回に引き続き、ビット操作です。 今回も数値のままビット操作をする根性がなかったので、0と1からなるリストに変換して操作しています。が、…

Prologはビットマップイメージの夢を見るか

Prologにハマっています。今日も「どう書く」の過去問から。 第2回 オフラインリアルタイムどう書くの参考問題 / 二値画像の回転 Prologでビットマップイメージを扱う。さてどうしたものか。 結局のところ。Prolog界に足を踏み入れたばかりの初級者では想像…

PrologでTick-Tack-Toeをどう書く

Prologのトレーニング中。今日も「どう書く」の過去問から。 Tick-Tack-Toe 〜 横へな 2012.7.6 今回は、条件分岐を使ってみたのですが、見事にハマりました。 gameの3番目の定義ですが、最初は次のように書いていました。 game([H|Hs], Player, Board, Resu…

「どう書く」を最初から解こうとして1問目で脳ミソが煮えそうになった件

Prologのトレーニングのために「どう書く」を最初から解いてみようと考えたまではよかったのですが。 第一回 オフラインリアルタイムどう書くの参考問題 - Qiita 1問目で頭から湯気が出そうになりました。 いま使っているPrologの処理系SWI-Prologのライブラ…

フカシギのPrologな通行止め

オフラインリアルタイムどう書く第四回の参考問題、「フカシギの通行止め」。絶対にPrologはこの問題を解くのに向いているはず…と思いつつも力量が追いつかずにそのままになっていました。 で、Prolog力をもっと身につけようとこちらのPrologのTutorialを読…

論理型言語Prologと関数型言語Haskellを比較してみた

PrologとHaskellで同じ問題を解いてみました。Prologで同程度の問題を解けるくらいのプログラミングができたのは初かもしれない…。 お題は鍋谷さんが開催されている「オフラインリアルタイムどう書く」の第4回のお題を利用させてもらいました。 テトロミノ認…

Prologは(たぶん)面白い、あるいは「40 - 32 / 2 = 4!」Prolog篇ふたたび

前回「むずいよ」と音を上げたPrologでの挑戦。半年以上を経ての再挑戦です。今回使用したPrologの実装はSWI-Prolog。本屋で手に取った参考書がSWI-Prologで解説されていたのでそれにならった次第。 SWI-Prolog 今のスキルレベルでは数値演算以外をできそう…

「40 - 32 / 2 = 4!」Prolog篇

読んでます。 7つの言語 7つの世界 8クイーンが解けるなら、これも解けるだろう… 「40 - 32 / 2 = 4!」数学篇 - エンジニアのソフトウェア的愛情 …と思ったまではよかったが。Prologむずいよ。 コードの中でA, B, Cの値を生成すればいいのかもしれないと…