commit efad83277171bc041e1c8c30add83a9412183630 Author: Arne Baeumler Date: Tue Sep 1 20:10:47 2015 +0200 initial import diff --git a/modules/aiml/AIML.pl b/modules/aiml/AIML.pl new file mode 100755 index 0000000..5c55a09 --- /dev/null +++ b/modules/aiml/AIML.pl @@ -0,0 +1,78 @@ +#!/usr/bin/perl + +use strict; +use warnings; + +use XML::Simple; +use Data::Dumper; + +die("Usage: $0 aiml.xml\n") unless($ARGV[0]); +open(XML,"<$ARGV[0]") or die("open($ARGV[0]): $!\n"); +my $aiml = ''; +while() { + $aiml .= $_; +} +close(XML); + +my $parser = XML::Simple->new(); +my $xml = $parser->XMLin($aiml); + +print "xml: " . Dumper($xml) . "\n"; + + +our $knowledge = {}; +foreach my $c (@{$xml->{category}}) { + print "pattern: $c->{pattern}\n"; + &addKnowledge($knowledge,$c->{pattern},$c->{template}); +} + +print "Knowledge: " . Dumper($knowledge) . "\n"; + +print "> "; +while(my $input = ) { + chomp($input); + print &findAnswer($knowledge,$input) . "\n"; + print "> "; +} + +sub findAnswer { + my ($struct,$input) = @_; + my ($key,$rest) = split(/\s+/,$input,2); + $key = '*' unless($struct->{uc($key)}); + if($rest) { + if($struct->{uc($key)}) { + &findAnswer($struct->{uc($key)},$rest); + } elsif($struct->{template}) { + return(&parseAnswer($struct)); + } elsif($struct->{'*'}) { + &findAnswer($struct->{'*'},$rest); + } + } else { + return(&parseAnswer($struct->{uc($key)})); + } +} + +sub parseAnswer { + my ($struct) = @_; + if(ref($struct->{template}) eq '') { + return($struct->{template}); + } elsif(ref($struct->{template}) eq 'HASH') { + if($struct->{template}->{random}) { + my @r = @{$struct->{template}->{random}->{li}}; + srand($$^time^$struct); + return($r[rand(int($#r) + 1)]); + } + } + return('I do not know what that means.'); +} + +sub addKnowledge { + my ($ref,$pattern,$template) = @_; + my ($key,$rest) = split(/\s+/,$pattern,2); + if($rest) { + &addKnowledge($ref->{uc($key)},$rest,$template); + } else { + $ref->{uc($key)}->{template} = $template; + } + return(1); +} diff --git a/modules/aiml/knowledge/main.aiml b/modules/aiml/knowledge/main.aiml new file mode 100644 index 0000000..5c5a7d5 --- /dev/null +++ b/modules/aiml/knowledge/main.aiml @@ -0,0 +1,17 @@ + + + + HELLO + + + + * + + + diff --git a/modules/aiml/parser-design.txt b/modules/aiml/parser-design.txt new file mode 100644 index 0000000..0a9e940 --- /dev/null +++ b/modules/aiml/parser-design.txt @@ -0,0 +1,20 @@ +Design: +my @input = split(/ /,$ARGV[0]); + + +Expand Map: +{ + don't => do not +} +... + +Pattern Map +{ + Do => You => -template => 'Yes I do', + Why => -that => { 'Do you' => 'Because I would like to know', + 'Go to sleep' => 'You seem tired' + }, + Hello => -template => ['How are you', 'What is your name', 'Where are you from?' ], +} + + diff --git a/modules/aiml/tasks b/modules/aiml/tasks new file mode 100644 index 0000000..288403b --- /dev/null +++ b/modules/aiml/tasks @@ -0,0 +1,29 @@ +/calendar +_ TODO _ +_ APPOINTMENTS _ +_ TASKS _ + +/status +BRIEF STATUS +STATUS OVERVIEW +FULL STATUS +CURRENT STATE + +/music +PLAY +PAUSE +LOAD _ +NEXT +BACK + +/cooking + + +/medicine + +/mail + +/homeautomation +LIGHTS _ ON +LIGHTS _ OFF + diff --git a/modules/aiml/test.pl b/modules/aiml/test.pl new file mode 100755 index 0000000..7f14cdb --- /dev/null +++ b/modules/aiml/test.pl @@ -0,0 +1,20 @@ +#!/usr/bin/perl + +use strict; +use warnings; +use Data::Dumper; + +my $ref = { + A => 1 +}; + +print "pre: " . Dumper($ref) . "\n"; + +&add($ref,'B','2'); + +sub add { + my ($struct,$key,$value) = @_; + $struct->{$key} = $value; +} + +print "post: " . Dumper($ref) . "\n";