use crate::{
control::Reasoner,
entity::{BudgetValue, Punctuation, SentenceV1, ShortFloat, Stamp, Task, TruthValue},
global::ClockTime,
inference::BudgetFunctions,
language::Term,
util::Serial,
};
use anyhow::{anyhow, Result};
use narsese::lexical::{Sentence as LexicalSentence, Task as LexicalTask};
impl Reasoner {
pub fn parse_task(
&self,
narsese: LexicalTask,
stamp_current_serial: ClockTime,
task_current_serial: Serial,
) -> Result<Task> {
use Punctuation::*;
let LexicalTask {
budget,
sentence:
LexicalSentence {
term,
punctuation,
stamp,
truth,
},
} = narsese;
let content = Term::try_from(term)?;
let stamp_time = self.time();
let stamp = Stamp::from_lexical(stamp, stamp_current_serial, stamp_time)?;
let punctuation = Punctuation::from_lexical(punctuation)?;
let truth_revisable = match punctuation {
Judgement => {
let truth_default_values = [
ShortFloat::from_float(self.parameters.default_judgement_frequency),
ShortFloat::from_float(self.parameters.default_judgement_confidence),
];
let truth_is_analytic = self.parameters.default_truth_analytic;
let truth =
TruthValue::from_lexical(truth, truth_default_values, truth_is_analytic)?;
let revisable = !(content.instanceof_conjunction() && content.contain_var_d());
Some((truth, revisable))
}
Question => None,
};
let sentence = SentenceV1::with_punctuation(content, punctuation, stamp, truth_revisable)?;
let [priority, durability, quality] = match (punctuation, truth_revisable) {
(Judgement, Some((truth, _))) => [
ShortFloat::from_float(self.parameters.default_judgement_priority),
ShortFloat::from_float(self.parameters.default_judgement_durability),
BudgetValue::truth_to_quality(&truth),
],
(Judgement, None) => {
return Err(anyhow!("【少见】在解析出判断句后,解析出的真值不应为空"))
}
(Question, _) => [
ShortFloat::from_float(self.parameters.default_question_priority),
ShortFloat::from_float(self.parameters.default_question_durability),
ShortFloat::ONE,
],
};
let budget = BudgetValue::from_lexical(budget, [priority, durability, quality])?;
let task = Task::from_input(task_current_serial, sentence, budget);
Ok(task)
}
pub fn parse_new_task(&mut self, narsese: LexicalTask) -> Result<Task> {
let stamp_current_serial = self.updated_stamp_current_serial();
let task_current_serial = self.updated_task_current_serial();
self.parse_task(narsese, stamp_current_serial, task_current_serial)
}
}