# 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])