binding attributed variables more eagerly after each implementation of verify_attributes/3 has been called (#248)
This commit is contained in:
@@ -165,6 +165,7 @@ pub enum SystemClauseType {
|
|||||||
CallAttributeGoals,
|
CallAttributeGoals,
|
||||||
CharCode,
|
CharCode,
|
||||||
CharsToNumber,
|
CharsToNumber,
|
||||||
|
ClearAttrVarBindings,
|
||||||
CloneAttributeGoals,
|
CloneAttributeGoals,
|
||||||
CodesToNumber,
|
CodesToNumber,
|
||||||
CopyTermWithoutAttrVars,
|
CopyTermWithoutAttrVars,
|
||||||
@@ -214,7 +215,7 @@ pub enum SystemClauseType {
|
|||||||
REPL(REPLCodePtr),
|
REPL(REPLCodePtr),
|
||||||
ReadQueryTerm,
|
ReadQueryTerm,
|
||||||
ReadTerm,
|
ReadTerm,
|
||||||
RedoAttrVarBindings,
|
RedoAttrVarBinding,
|
||||||
RemoveCallPolicyCheck,
|
RemoveCallPolicyCheck,
|
||||||
RemoveInferenceCounter,
|
RemoveInferenceCounter,
|
||||||
ResetGlobalVarAtKey,
|
ResetGlobalVarAtKey,
|
||||||
@@ -280,6 +281,7 @@ impl SystemClauseType {
|
|||||||
&SystemClauseType::REPL(REPLCodePtr::UseQualifiedModuleFromFile) => {
|
&SystemClauseType::REPL(REPLCodePtr::UseQualifiedModuleFromFile) => {
|
||||||
clause_name!("$use_qualified_module_from_file")
|
clause_name!("$use_qualified_module_from_file")
|
||||||
}
|
}
|
||||||
|
&SystemClauseType::ClearAttrVarBindings => clause_name!("$clear_attr_var_bindings"),
|
||||||
&SystemClauseType::CopyToLiftedHeap => clause_name!("$copy_to_lh"),
|
&SystemClauseType::CopyToLiftedHeap => clause_name!("$copy_to_lh"),
|
||||||
&SystemClauseType::DeleteAttribute => clause_name!("$del_attr_non_head"),
|
&SystemClauseType::DeleteAttribute => clause_name!("$del_attr_non_head"),
|
||||||
&SystemClauseType::DeleteHeadAttribute => clause_name!("$del_attr_head"),
|
&SystemClauseType::DeleteHeadAttribute => clause_name!("$del_attr_head"),
|
||||||
@@ -340,7 +342,7 @@ impl SystemClauseType {
|
|||||||
&SystemClauseType::NumberToChars => clause_name!("$number_to_chars"),
|
&SystemClauseType::NumberToChars => clause_name!("$number_to_chars"),
|
||||||
&SystemClauseType::NumberToCodes => clause_name!("$number_to_codes"),
|
&SystemClauseType::NumberToCodes => clause_name!("$number_to_codes"),
|
||||||
&SystemClauseType::RawInputReadChar => clause_name!("$raw_input_read_char"),
|
&SystemClauseType::RawInputReadChar => clause_name!("$raw_input_read_char"),
|
||||||
&SystemClauseType::RedoAttrVarBindings => clause_name!("$redo_attr_var_bindings"),
|
&SystemClauseType::RedoAttrVarBinding => clause_name!("$redo_attr_var_binding"),
|
||||||
&SystemClauseType::RemoveCallPolicyCheck => clause_name!("$remove_call_policy_check"),
|
&SystemClauseType::RemoveCallPolicyCheck => clause_name!("$remove_call_policy_check"),
|
||||||
&SystemClauseType::RemoveInferenceCounter => clause_name!("$remove_inference_counter"),
|
&SystemClauseType::RemoveInferenceCounter => clause_name!("$remove_inference_counter"),
|
||||||
&SystemClauseType::RestoreCutPolicy => clause_name!("$restore_cut_policy"),
|
&SystemClauseType::RestoreCutPolicy => clause_name!("$restore_cut_policy"),
|
||||||
@@ -395,6 +397,7 @@ impl SystemClauseType {
|
|||||||
("$call_attribute_goals", 2) => Some(SystemClauseType::CallAttributeGoals),
|
("$call_attribute_goals", 2) => Some(SystemClauseType::CallAttributeGoals),
|
||||||
("$char_code", 2) => Some(SystemClauseType::CharCode),
|
("$char_code", 2) => Some(SystemClauseType::CharCode),
|
||||||
("$chars_to_number", 2) => Some(SystemClauseType::CharsToNumber),
|
("$chars_to_number", 2) => Some(SystemClauseType::CharsToNumber),
|
||||||
|
("$clear_attr_var_bindings", 0) => Some(SystemClauseType::ClearAttrVarBindings),
|
||||||
("$clone_attribute_goals", 1) => Some(SystemClauseType::CloneAttributeGoals),
|
("$clone_attribute_goals", 1) => Some(SystemClauseType::CloneAttributeGoals),
|
||||||
("$codes_to_number", 2) => Some(SystemClauseType::CodesToNumber),
|
("$codes_to_number", 2) => Some(SystemClauseType::CodesToNumber),
|
||||||
("$copy_term_without_attr_vars", 2) => Some(SystemClauseType::CopyTermWithoutAttrVars),
|
("$copy_term_without_attr_vars", 2) => Some(SystemClauseType::CopyTermWithoutAttrVars),
|
||||||
@@ -444,7 +447,7 @@ impl SystemClauseType {
|
|||||||
("$number_to_chars", 2) => Some(SystemClauseType::NumberToChars),
|
("$number_to_chars", 2) => Some(SystemClauseType::NumberToChars),
|
||||||
("$number_to_codes", 2) => Some(SystemClauseType::NumberToCodes),
|
("$number_to_codes", 2) => Some(SystemClauseType::NumberToCodes),
|
||||||
("$op", 3) => Some(SystemClauseType::OpDeclaration),
|
("$op", 3) => Some(SystemClauseType::OpDeclaration),
|
||||||
("$redo_attr_var_bindings", 0) => Some(SystemClauseType::RedoAttrVarBindings),
|
("$redo_attr_var_binding", 2) => Some(SystemClauseType::RedoAttrVarBinding),
|
||||||
("$remove_call_policy_check", 1) => Some(SystemClauseType::RemoveCallPolicyCheck),
|
("$remove_call_policy_check", 1) => Some(SystemClauseType::RemoveCallPolicyCheck),
|
||||||
("$remove_inference_counter", 2) => Some(SystemClauseType::RemoveInferenceCounter),
|
("$remove_inference_counter", 2) => Some(SystemClauseType::RemoveInferenceCounter),
|
||||||
("$restore_cut_policy", 0) => Some(SystemClauseType::RestoreCutPolicy),
|
("$restore_cut_policy", 0) => Some(SystemClauseType::RestoreCutPolicy),
|
||||||
|
|||||||
@@ -46,7 +46,8 @@
|
|||||||
'$get_attr_list'(V, Ls), '$add_to_list'(Ls, V, Attr).
|
'$get_attr_list'(V, Ls), '$add_to_list'(Ls, V, Attr).
|
||||||
|
|
||||||
'$add_to_list'(Ls, V, Attr) :-
|
'$add_to_list'(Ls, V, Attr) :-
|
||||||
( var(Ls) -> Ls = [Attr | _], '$enqueue_attr_var'(V)
|
( var(Ls) ->
|
||||||
|
Ls = [Attr | _], '$enqueue_attr_var'(V)
|
||||||
; Ls = [_ | Ls0], '$add_to_list'(Ls0, V, Attr)
|
; Ls = [_ | Ls0], '$add_to_list'(Ls0, V, Attr)
|
||||||
).
|
).
|
||||||
|
|
||||||
@@ -56,7 +57,8 @@
|
|||||||
Ls0 = [Att | Ls1],
|
Ls0 = [Att | Ls1],
|
||||||
nonvar(Att),
|
nonvar(Att),
|
||||||
( Att \= Attr -> '$del_attr_buried'(Ls0, Ls1, V, Attr)
|
( Att \= Attr -> '$del_attr_buried'(Ls0, Ls1, V, Attr)
|
||||||
; '$enqueue_attr_var'(V), '$del_attr_head'(V), '$del_attr'(Ls1, V, Attr)
|
; '$enqueue_attr_var'(V),
|
||||||
|
'$del_attr_head'(V), '$del_attr'(Ls1, V, Attr)
|
||||||
).
|
).
|
||||||
|
|
||||||
'$del_attr_step'(Ls1, V, Attr) :-
|
'$del_attr_step'(Ls1, V, Attr) :-
|
||||||
@@ -122,13 +124,18 @@ put_attr(Name, Arity) -->
|
|||||||
{ functor(Attr, Name, Arity),
|
{ functor(Attr, Name, Arity),
|
||||||
numbervars(Attr, 0, Arity),
|
numbervars(Attr, 0, Arity),
|
||||||
V = '$VAR'(Arity) },
|
V = '$VAR'(Arity) },
|
||||||
[(put_atts(V, +Attr) :- !, functor(Attr, Head, Arity), functor(AttrForm, Head, Arity),
|
[(put_atts(V, +Attr) :- !, functor(Attr, Head, Arity),
|
||||||
'$get_attr_list'(V, Ls), '$del_attr'(Ls, V, AttrForm),
|
functor(AttrForm, Head, Arity),
|
||||||
|
'$get_attr_list'(V, Ls),
|
||||||
|
'$del_attr'(Ls, V, AttrForm),
|
||||||
'$put_attr'(V, Attr)),
|
'$put_attr'(V, Attr)),
|
||||||
(put_atts(V, Attr) :- !, functor(Attr, Head, Arity), functor(AttrForm, Head, Arity),
|
(put_atts(V, Attr) :- !, functor(Attr, Head, Arity),
|
||||||
'$get_attr_list'(V, Ls), '$del_attr'(Ls, V, AttrForm),
|
functor(AttrForm, Head, Arity),
|
||||||
|
'$get_attr_list'(V, Ls),
|
||||||
|
'$del_attr'(Ls, V, AttrForm),
|
||||||
'$put_attr'(V, Attr)),
|
'$put_attr'(V, Attr)),
|
||||||
(put_atts(V, -Attr) :- !, functor(Attr, _, _), '$get_attr_list'(V, Ls),
|
(put_atts(V, -Attr) :- !, functor(Attr, _, _),
|
||||||
|
'$get_attr_list'(V, Ls),
|
||||||
'$del_attr'(Ls, V, Attr))].
|
'$del_attr'(Ls, V, Attr))].
|
||||||
|
|
||||||
get_attr(Name, Arity) -->
|
get_attr(Name, Arity) -->
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
driver(Vars, Values) :-
|
driver(Vars, Values) :-
|
||||||
iterate(Vars, Values, ListOfListsOfGoalLists),
|
iterate(Vars, Values, ListOfListsOfGoalLists),
|
||||||
'$redo_attr_var_bindings', % the bindings list is emptied here.
|
'$clear_attr_var_bindings',
|
||||||
!,
|
!,
|
||||||
call_goals(ListOfListsOfGoalLists),
|
call_goals(ListOfListsOfGoalLists),
|
||||||
'$return_from_verify_attr'.
|
'$return_from_verify_attr'.
|
||||||
@@ -8,6 +8,7 @@ driver(Vars, Values) :-
|
|||||||
iterate([Var|VarBindings], [Value|ValueBindings], [ListOfGoalLists | ListsCubed]) :-
|
iterate([Var|VarBindings], [Value|ValueBindings], [ListOfGoalLists | ListsCubed]) :-
|
||||||
'$get_attr_list'(Var, Ls),
|
'$get_attr_list'(Var, Ls),
|
||||||
call_verify_attributes(Ls, Var, Value, ListOfGoalLists),
|
call_verify_attributes(Ls, Var, Value, ListOfGoalLists),
|
||||||
|
'$redo_attr_var_binding'(Var, Value),
|
||||||
iterate(VarBindings, ValueBindings, ListsCubed).
|
iterate(VarBindings, ValueBindings, ListsCubed).
|
||||||
iterate([], [], []).
|
iterate([], [], []).
|
||||||
|
|
||||||
|
|||||||
@@ -649,7 +649,8 @@ impl ListingCompiler {
|
|||||||
let idx = code_dir
|
let idx = code_dir
|
||||||
.entry((name.clone(), arity))
|
.entry((name.clone(), arity))
|
||||||
.or_insert(CodeIndex::default());
|
.or_insert(CodeIndex::default());
|
||||||
set_code_index!(idx, IndexPtr::Index(p), self.get_module_name());
|
|
||||||
|
set_code_index!(idx, IndexPtr::Index(p), self.get_module_name());
|
||||||
|
|
||||||
self.localize_self_calls(name, arity, &mut decl_code, p);
|
self.localize_self_calls(name, arity, &mut decl_code, p);
|
||||||
code.extend(decl_code.into_iter());
|
code.extend(decl_code.into_iter());
|
||||||
|
|||||||
@@ -1644,11 +1644,32 @@ impl MachineState {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
&SystemClauseType::RedoAttrVarBindings => {
|
&SystemClauseType::ClearAttrVarBindings => {
|
||||||
let bindings = mem::replace(&mut self.attr_var_init.bindings, vec![]);
|
self.attr_var_init.bindings.clear();
|
||||||
|
}
|
||||||
|
&SystemClauseType::RedoAttrVarBinding => {
|
||||||
|
let var = self.store(self.deref(self[temp_v!(1)].clone()));
|
||||||
|
let value = self.store(self.deref(self[temp_v!(2)].clone()));
|
||||||
|
|
||||||
for (h, addr) in bindings {
|
match var {
|
||||||
self.heap[h] = HeapCellValue::Addr(addr);
|
Addr::AttrVar(h) => {
|
||||||
|
if let Addr::AttrVar(h1) = value {
|
||||||
|
self.heap[h] = HeapCellValue::Addr(Addr::AttrVar(h1));
|
||||||
|
|
||||||
|
// append h's attributes list to h1's.
|
||||||
|
let mut l = h1 + 1;
|
||||||
|
|
||||||
|
while let Addr::Lis(l1) = self.store(self.deref(self.heap[l].as_addr(l))) {
|
||||||
|
l = l1 + 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
self.heap[l] = HeapCellValue::Addr(Addr::HeapCell(h + 1));
|
||||||
|
self.trail(TrailRef::Ref(Ref::HeapCell(l)));
|
||||||
|
} else {
|
||||||
|
self.heap[h] = HeapCellValue::Addr(value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_ => unreachable!()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
&SystemClauseType::ResetGlobalVarAtKey => {
|
&SystemClauseType::ResetGlobalVarAtKey => {
|
||||||
|
|||||||
Reference in New Issue
Block a user