# Thanks to aristotle for making the regex simpler
my $string = "abcd";
my @perms;
my $regex = qr/(\G[abcd]{0,4}(?{print "# [$&][$'][$string]\n"}))/ x 2;
$string =~ $regex;
####
# [abcd][][abcd]
# [abc][d][abcd]
# [ab][cd][abcd]
# [a][bcd][abcd]
# [][abcd][abcd]
# [abcd][][abcd]
##
##
append([], X, X).
append([W|X],Y,[W|Z]) :- append(X,Y,Z).
##
##
[a,b,c],[d,e,f],[a,b,c,d,e,f]
if [b,c],[d,e,f],[b,c,d,e,f]
if [c],[d,e,f],[c,d,e,f]
if [],[d,e,f],[d,e,f]
##
##
#!/usr/local/bin/perl -l
use strict;
use warnings;
use lib '../lib/';
use aliased 'AI::Prolog::Parser';
use aliased 'AI::Prolog::Term';
use aliased 'AI::Prolog::Engine';
my $parser = Parser->new("append([a],[b,c,d],Z).");
my $query = Term->new($parser);
my $engine = Engine->new($query,Parser->consult(append_prog()));
print "Appending two lists 'append([a],[b,c,d],Z).'";
print $engine->run;
while (my $result = $engine->more) {
print $result;
}
$parser = Parser->new("append(X,[b,c,d],[a,b,c,d]).");
$query = Term->new($parser);
$engine = Engine->new($query,Parser->consult(append_prog()));
print "\nWhich lists appends to a known list to form another known list 'append(X,[b,c,d],[a,b,c,d]).'";
print $engine->run;
while (my $result = $engine->more) {
print $result;
}
$parser = Parser->new("append(X,Y,[a,b,c,d]).");
$query = Term->new($parser);
$engine = Engine->new($query,Parser->consult(append_prog()));
print "\nWhich lists append to form a known list 'append(X,Y,[a,b,c,d]).'";
print $engine->run;
while (my $result = $engine->more) {
print $result;
}
sub append_prog {
"append([], X, X)."
."append([W|X],Y,[W|Z]) :- append(X,Y,Z).";
}
##
##
Appending two lists 'append([a],[b,c,d],Z).'
append([a],[b,c,d],[a,b,c,d])
Which lists appends to a known list to form another known list 'append(X,[b,c,d],[a,b,c,d]).'
append([a],[b,c,d],[a,b,c,d])
Which lists append to form a known list 'append(X,Y,[a,b,c,d]).'
append([],[a,b,c,d],[a,b,c,d])
append([a],[b,c,d],[a,b,c,d])
append([a,b],[c,d],[a,b,c,d])
append([a,b,c],[d],[a,b,c,d])
append([a,b,c,d],[],[a,b,c,d])