Skip to content

Instantly share code, notes, and snippets.

@lolicsystem
Created November 12, 2010 09:28
Show Gist options
  • Save lolicsystem/673907 to your computer and use it in GitHub Desktop.
Save lolicsystem/673907 to your computer and use it in GitHub Desktop.
4桁の数字に3回四則演算を行う RPN を作る際に、「数値(d)と演算子(o)の積み方」 をキチンと考えないと、計算できない式ができてしまうので、そのバリデーションを行うのに AI::Prolog を使ってみた。ちなみに、「式というのは数値そのものか、2個の式の後に1個の演算子が付くもの」というのをPrologで宣言している。以下、そのテスト。
#!/usr/bin/perl
use strict;
use warnings;
use AI::Prolog;
use 5.010;
my @formulae = (
"d", # 数だけは式だよね。OK 出るはず。
"d d o", # 数を2個積んで、それらを演算。OK 出るはず。
"o", # いきなり演算。これは NG のはず。
"d d o d o ", # 最初2個の数を演算した結果と、
# 3個目の数を演算。OK 出るはず。
"d d d o o d", # 2個目の数と3個目の数を演算した結果と、
# 1個目の数を演算するけど、さらに 4個目の
# 数が演算されないまま残るので NG のはず。
"d d d o d d o o o d d d d o o o o",
# 長い例。これ、OK のはず。
);
my $database =<< 'END_PROLOG';
append([], Z, Z).
append([W|X1], Y, [W|Z1]) :- append(X1, Y, Z1).
formula([d]).
formula(X) :- append(F1, FandO, X),
append(F2, [o], FandO),
formula(F1),
formula(F2).
END_PROLOG
my $prolog = AI::Prolog->new($database);
for my $pat (@formulae) {
my $list = $prolog->list(split " ", $pat);
$prolog->query("formula([$list]).");
if ($prolog->results) {
say "OK(^o^) - $pat";
} else {
say "NG(>_<) - $pat";
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment