Skip to content

Instantly share code, notes, and snippets.

@lolicsystem
Created November 15, 2010 18:18
Show Gist options
  • Save lolicsystem/700711 to your computer and use it in GitHub Desktop.
Save lolicsystem/700711 to your computer and use it in GitHub Desktop.
AI::Prologのバックトラックを、そのままイテレータとして使用して、「4桁の数字に3回四則演算を行う RPN」を自動生成してみた例。遅い! あと、Prolog部の「formula/1」の定義のカット(!)を取ると帰ってこなくなる。ところが、SWI-Prolog等では帰ってくる。再帰最適化の違いのせい??
#!/usr/bin/perl
use strict;
use warnings;
use AI::Prolog;
use 5.010;
my $database =<< 'END_PROLOG';
append([], Z, Z).
append([W|X1], Y, [W|Z1]) :- append(X1, Y, Z1).
length([], 0).
length([X|Xs], N) :- length(Xs, N1), N is N1 + 1.
formula([D]) :- digit(D).
formula(X) :- append(F1, FandO, X),
append(F2, [O], FandO),
operator(O),
formula(F1),
formula(F2).
formula7(X) :- length(X, 7), !, formula(X).
digit(0).
digit(1).
digit(2).
digit(3).
digit(4).
digit(5).
digit(6).
digit(7).
digit(8).
digit(9).
operator("+").
operator("-").
operator("*").
operator("/").
END_PROLOG
my $prolog = AI::Prolog->new($database);
$prolog->query("formula7(X).");
while (my $result = $prolog->results) {
say join " ", @{$result->[1]};
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment