remove IsClause
This commit is contained in:
@@ -784,7 +784,7 @@ impl SystemClauseType {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Copy, Clone, PartialEq)]
|
#[derive(Clone, PartialEq)]
|
||||||
pub enum BuiltInClauseType {
|
pub enum BuiltInClauseType {
|
||||||
AcyclicTerm,
|
AcyclicTerm,
|
||||||
Arg,
|
Arg,
|
||||||
@@ -796,7 +796,7 @@ pub enum BuiltInClauseType {
|
|||||||
Eq,
|
Eq,
|
||||||
Functor,
|
Functor,
|
||||||
Ground,
|
Ground,
|
||||||
Is,
|
Is(RegType, ArithmeticTerm),
|
||||||
KeySort,
|
KeySort,
|
||||||
NotEq,
|
NotEq,
|
||||||
Sort,
|
Sort,
|
||||||
@@ -881,7 +881,7 @@ impl BuiltInClauseType {
|
|||||||
fn fixity(&self) -> Option<Fixity> {
|
fn fixity(&self) -> Option<Fixity> {
|
||||||
match self {
|
match self {
|
||||||
&BuiltInClauseType::Compare | &BuiltInClauseType::CompareTerm(_)
|
&BuiltInClauseType::Compare | &BuiltInClauseType::CompareTerm(_)
|
||||||
| &BuiltInClauseType::NotEq | &BuiltInClauseType::Is | &BuiltInClauseType::Eq
|
| &BuiltInClauseType::NotEq | &BuiltInClauseType::Is(..) | &BuiltInClauseType::Eq
|
||||||
=> Some(Fixity::In),
|
=> Some(Fixity::In),
|
||||||
_ => None
|
_ => None
|
||||||
}
|
}
|
||||||
@@ -899,7 +899,7 @@ impl BuiltInClauseType {
|
|||||||
&BuiltInClauseType::Eq => clause_name!("=="),
|
&BuiltInClauseType::Eq => clause_name!("=="),
|
||||||
&BuiltInClauseType::Functor => clause_name!("functor"),
|
&BuiltInClauseType::Functor => clause_name!("functor"),
|
||||||
&BuiltInClauseType::Ground => clause_name!("ground"),
|
&BuiltInClauseType::Ground => clause_name!("ground"),
|
||||||
&BuiltInClauseType::Is => clause_name!("is"),
|
&BuiltInClauseType::Is(..) => clause_name!("is"),
|
||||||
&BuiltInClauseType::KeySort => clause_name!("keysort"),
|
&BuiltInClauseType::KeySort => clause_name!("keysort"),
|
||||||
&BuiltInClauseType::NotEq => clause_name!("\\=="),
|
&BuiltInClauseType::NotEq => clause_name!("\\=="),
|
||||||
&BuiltInClauseType::Sort => clause_name!("sort"),
|
&BuiltInClauseType::Sort => clause_name!("sort"),
|
||||||
@@ -918,7 +918,7 @@ impl BuiltInClauseType {
|
|||||||
&BuiltInClauseType::Eq => 2,
|
&BuiltInClauseType::Eq => 2,
|
||||||
&BuiltInClauseType::Functor => 3,
|
&BuiltInClauseType::Functor => 3,
|
||||||
&BuiltInClauseType::Ground => 1,
|
&BuiltInClauseType::Ground => 1,
|
||||||
&BuiltInClauseType::Is => 2,
|
&BuiltInClauseType::Is(..) => 2,
|
||||||
&BuiltInClauseType::KeySort => 2,
|
&BuiltInClauseType::KeySort => 2,
|
||||||
&BuiltInClauseType::NotEq => 2,
|
&BuiltInClauseType::NotEq => 2,
|
||||||
&BuiltInClauseType::Sort => 2,
|
&BuiltInClauseType::Sort => 2,
|
||||||
@@ -942,7 +942,7 @@ impl BuiltInClauseType {
|
|||||||
("==", 2) => Some(BuiltInClauseType::Eq),
|
("==", 2) => Some(BuiltInClauseType::Eq),
|
||||||
("functor", 3) => Some(BuiltInClauseType::Functor),
|
("functor", 3) => Some(BuiltInClauseType::Functor),
|
||||||
("ground", 1) => Some(BuiltInClauseType::Ground),
|
("ground", 1) => Some(BuiltInClauseType::Ground),
|
||||||
("is", 2) => Some(BuiltInClauseType::Is),
|
("is", 2) => Some(BuiltInClauseType::Is(temp_v!(1), ArithmeticTerm::Reg(temp_v!(2)))),
|
||||||
("keysort", 2) => Some(BuiltInClauseType::KeySort),
|
("keysort", 2) => Some(BuiltInClauseType::KeySort),
|
||||||
("\\==", 2) => Some(BuiltInClauseType::NotEq),
|
("\\==", 2) => Some(BuiltInClauseType::NotEq),
|
||||||
("sort", 2) => Some(BuiltInClauseType::Sort),
|
("sort", 2) => Some(BuiltInClauseType::Sort),
|
||||||
@@ -965,7 +965,7 @@ impl ClauseType {
|
|||||||
pub fn name(&self) -> ClauseName {
|
pub fn name(&self) -> ClauseName {
|
||||||
match self {
|
match self {
|
||||||
&ClauseType::CallN => clause_name!("call"),
|
&ClauseType::CallN => clause_name!("call"),
|
||||||
&ClauseType::BuiltIn(built_in) => built_in.name(),
|
&ClauseType::BuiltIn(ref built_in) => built_in.name(),
|
||||||
&ClauseType::Inlined(ref inlined) => clause_name!(inlined.name()),
|
&ClauseType::Inlined(ref inlined) => clause_name!(inlined.name()),
|
||||||
&ClauseType::Op(ref name, ..) => name.clone(),
|
&ClauseType::Op(ref name, ..) => name.clone(),
|
||||||
&ClauseType::Named(ref name, ..) => name.clone(),
|
&ClauseType::Named(ref name, ..) => name.clone(),
|
||||||
@@ -1374,7 +1374,6 @@ pub enum ControlInstruction {
|
|||||||
CheckCpExecute,
|
CheckCpExecute,
|
||||||
Deallocate,
|
Deallocate,
|
||||||
GetCleanerCall,
|
GetCleanerCall,
|
||||||
IsClause(bool, RegType, ArithmeticTerm), // last call, register of var, term.
|
|
||||||
JmpBy(usize, usize, usize, bool), // arity, global_offset, perm_vars after threshold, last call.
|
JmpBy(usize, usize, usize, bool), // arity, global_offset, perm_vars after threshold, last call.
|
||||||
Proceed
|
Proceed
|
||||||
}
|
}
|
||||||
@@ -1384,7 +1383,6 @@ impl ControlInstruction {
|
|||||||
match self {
|
match self {
|
||||||
&ControlInstruction::CallClause(..) => true,
|
&ControlInstruction::CallClause(..) => true,
|
||||||
&ControlInstruction::GetCleanerCall => true,
|
&ControlInstruction::GetCleanerCall => true,
|
||||||
&ControlInstruction::IsClause(..) => true,
|
|
||||||
&ControlInstruction::JmpBy(..) => true,
|
&ControlInstruction::JmpBy(..) => true,
|
||||||
_ => false
|
_ => false
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -234,8 +234,6 @@ impl<'a, TermMarker: Allocator<'a>> CodeGenerator<TermMarker>
|
|||||||
*ctrl = ControlInstruction::CallClause(ct, arity, pvs, true),
|
*ctrl = ControlInstruction::CallClause(ct, arity, pvs, true),
|
||||||
ControlInstruction::JmpBy(arity, offset, pvs, false) =>
|
ControlInstruction::JmpBy(arity, offset, pvs, false) =>
|
||||||
*ctrl = ControlInstruction::JmpBy(arity, offset, pvs, true),
|
*ctrl = ControlInstruction::JmpBy(arity, offset, pvs, true),
|
||||||
ControlInstruction::IsClause(false, r, at) =>
|
|
||||||
*ctrl = ControlInstruction::IsClause(true, r, at),
|
|
||||||
ControlInstruction::Proceed => {},
|
ControlInstruction::Proceed => {},
|
||||||
_ => dealloc_index += 1
|
_ => dealloc_index += 1
|
||||||
},
|
},
|
||||||
@@ -414,7 +412,8 @@ impl<'a, TermMarker: Allocator<'a>> CodeGenerator<TermMarker>
|
|||||||
} else {
|
} else {
|
||||||
Line::Cut(CutInstruction::Cut(perm_v!(1)))
|
Line::Cut(CutInstruction::Cut(perm_v!(1)))
|
||||||
}),
|
}),
|
||||||
&QueryTerm::Clause(_, ClauseType::BuiltIn(BuiltInClauseType::Is), ref terms) =>
|
&QueryTerm::Clause(_, ClauseType::BuiltIn(BuiltInClauseType::Is(..)), ref terms)
|
||||||
|
=>
|
||||||
{
|
{
|
||||||
let (mut acode, at) = self.call_arith_eval(terms[1].as_ref(), 1)?;
|
let (mut acode, at) = self.call_arith_eval(terms[1].as_ref(), 1)?;
|
||||||
code.append(&mut acode);
|
code.append(&mut acode);
|
||||||
|
|||||||
@@ -139,10 +139,6 @@ impl fmt::Display for ControlInstruction {
|
|||||||
write!(f, "deallocate"),
|
write!(f, "deallocate"),
|
||||||
&ControlInstruction::GetCleanerCall =>
|
&ControlInstruction::GetCleanerCall =>
|
||||||
write!(f, "get_cleaner_call"),
|
write!(f, "get_cleaner_call"),
|
||||||
&ControlInstruction::IsClause(false, r, ref at) =>
|
|
||||||
write!(f, "is_call {}, {}", r, at),
|
|
||||||
&ControlInstruction::IsClause(true, r, ref at) =>
|
|
||||||
write!(f, "is_execute {}, {}", r, at),
|
|
||||||
&ControlInstruction::JmpBy(arity, offset, pvs, false) =>
|
&ControlInstruction::JmpBy(arity, offset, pvs, false) =>
|
||||||
write!(f, "jmp_by_call {}/{}, {}", offset, arity, pvs),
|
write!(f, "jmp_by_call {}/{}, {}", offset, arity, pvs),
|
||||||
&ControlInstruction::JmpBy(arity, offset, pvs, true) =>
|
&ControlInstruction::JmpBy(arity, offset, pvs, true) =>
|
||||||
|
|||||||
@@ -510,11 +510,11 @@ pub(crate) trait CallPolicy: Any {
|
|||||||
|
|
||||||
return_from_clause!(machine_st.last_call, machine_st)
|
return_from_clause!(machine_st.last_call, machine_st)
|
||||||
},
|
},
|
||||||
&BuiltInClauseType::Is => {
|
&BuiltInClauseType::Is(r, ref at) => {
|
||||||
let a = machine_st[temp_v!(1)].clone();
|
let a1 = machine_st[r].clone();
|
||||||
let result = machine_st.arith_eval_by_metacall(temp_v!(2))?;
|
let a2 = machine_st.get_number(at)?;
|
||||||
|
|
||||||
machine_st.unify(a, Addr::Con(Constant::Number(result)));
|
machine_st.unify(a1, Addr::Con(Constant::Number(a2)));
|
||||||
return_from_clause!(machine_st.last_call, machine_st)
|
return_from_clause!(machine_st.last_call, machine_st)
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -323,7 +323,7 @@ impl MachineState {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
fn get_number(&self, at: &ArithmeticTerm) -> Result<Number, MachineError> {
|
pub(super) fn get_number(&self, at: &ArithmeticTerm) -> Result<Number, MachineError> {
|
||||||
match at {
|
match at {
|
||||||
&ArithmeticTerm::Reg(r) => self.arith_eval_by_metacall(r),
|
&ArithmeticTerm::Reg(r) => self.arith_eval_by_metacall(r),
|
||||||
&ArithmeticTerm::Interm(i) => Ok(self.interms[i-1].clone()),
|
&ArithmeticTerm::Interm(i) => Ok(self.interms[i-1].clone()),
|
||||||
@@ -1879,15 +1879,6 @@ impl MachineState {
|
|||||||
|
|
||||||
self.fail = true;
|
self.fail = true;
|
||||||
},
|
},
|
||||||
&ControlInstruction::IsClause(lco, r, ref at) => {
|
|
||||||
self.last_call = lco;
|
|
||||||
|
|
||||||
let a1 = self[r].clone();
|
|
||||||
let a2 = try_or_fail!(self, self.get_number(at));
|
|
||||||
|
|
||||||
self.unify(a1, Addr::Con(Constant::Number(a2)));
|
|
||||||
try_or_fail!(self, return_from_clause!(self.last_call, self));
|
|
||||||
},
|
|
||||||
&ControlInstruction::JmpBy(arity, offset, _, lco) => {
|
&ControlInstruction::JmpBy(arity, offset, _, lco) => {
|
||||||
if !lco {
|
if !lco {
|
||||||
self.cp.assign_if_local(self.p.clone() + 1);
|
self.cp.assign_if_local(self.p.clone() + 1);
|
||||||
|
|||||||
@@ -233,7 +233,7 @@ impl Machine {
|
|||||||
CodePtr::Local(LocalCodePtr::DirEntry(p, _)) =>
|
CodePtr::Local(LocalCodePtr::DirEntry(p, _)) =>
|
||||||
Some(self.code[p].clone()),
|
Some(self.code[p].clone()),
|
||||||
CodePtr::BuiltInClause(built_in, _) =>
|
CodePtr::BuiltInClause(built_in, _) =>
|
||||||
Some(call_clause!(ClauseType::BuiltIn(built_in), built_in.arity(),
|
Some(call_clause!(ClauseType::BuiltIn(built_in.clone()), built_in.arity(),
|
||||||
0, self.ms.last_call)),
|
0, self.ms.last_call)),
|
||||||
CodePtr::CallN(arity, _) =>
|
CodePtr::CallN(arity, _) =>
|
||||||
Some(call_clause!(ClauseType::CallN, arity, 0, self.ms.last_call))
|
Some(call_clause!(ClauseType::CallN, arity, 0, self.ms.last_call))
|
||||||
|
|||||||
@@ -148,7 +148,7 @@ macro_rules! proceed {
|
|||||||
|
|
||||||
macro_rules! is_call {
|
macro_rules! is_call {
|
||||||
($r:expr, $at:expr) => (
|
($r:expr, $at:expr) => (
|
||||||
Line::Control(ControlInstruction::IsClause(false, $r, $at))
|
call_clause!(ClauseType::BuiltIn(BuiltInClauseType::Is($r, $at)), 2, 0)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user