diff --git a/src/prolog/machine/system_calls.rs b/src/prolog/machine/system_calls.rs index 2b521d40..03ec8311 100644 --- a/src/prolog/machine/system_calls.rs +++ b/src/prolog/machine/system_calls.rs @@ -33,7 +33,9 @@ use crate::crossterm::terminal::{enable_raw_mode, disable_raw_mode}; pub enum ContinueResult { ContinueQuery, Conclude, + Help, PrintWithoutMaxDepth, + PrintWithMaxDepth } pub fn next_keypress() -> ContinueResult { @@ -44,12 +46,18 @@ pub fn next_keypress() -> ContinueResult { KeyCode::Char('w') => { return ContinueResult::PrintWithoutMaxDepth; } + KeyCode::Char('p') => { + return ContinueResult::PrintWithMaxDepth; + } KeyCode::Char(' ') | KeyCode::Char(';') | KeyCode::Char('n') => { return ContinueResult::ContinueQuery; } KeyCode::Char('.') => { return ContinueResult::Conclude; } + KeyCode::Char('h') => { + return ContinueResult::Help; + } _ => {} } } @@ -2347,7 +2355,9 @@ impl MachineState { let c = match keypress { ContinueResult::ContinueQuery => ';', ContinueResult::Conclude => '.', + ContinueResult::Help => 'h', ContinueResult::PrintWithoutMaxDepth => 'w', + ContinueResult::PrintWithMaxDepth => 'p', }; let target = self[temp_v!(1)].clone(); diff --git a/src/prolog/toplevel.pl b/src/prolog/toplevel.pl index edf00883..3abadd7c 100644 --- a/src/prolog/toplevel.pl +++ b/src/prolog/toplevel.pl @@ -184,17 +184,33 @@ '$read_input'(ThreadedGoals, NewVarList) :- '$raw_input_read_char'(C), - ( C == ('w'), !, + ( C == w -> nl, write(' '), '$write_eq'(ThreadedGoals, NewVarList, 0), '$read_input'(ThreadedGoals, NewVarList) - ; C == (';'), !, + ; C == p -> + nl, + write(' '), + '$write_eq'(ThreadedGoals, NewVarList, 20), + '$read_input'(ThreadedGoals, NewVarList) + ; C == (';') -> nl, write('; '), false - ; C == ('.'), !, + ; C == h -> + '$help_message', + '$read_input'(ThreadedGoals, NewVarList) + ; C == '.', nl, write(' ...'), nl ). +'$help_message' :- + nl, nl, + write('SPACE, "n" or ";": next solution, if any\n'), + write('".": stop enumeration\n'), + write('"h": display this help message\n'), + write('"w": write terms without depth limit\n'), + write('"p": print terms with depth limit\n\n'). + '$gather_query_vars'([_ = Var | Vars], QueryVars) :- ( var(Var) -> QueryVars = [Var | QueryVars1],