clause_name!("$cpp_meta_predicate_property"),
&SystemClauseType::REPL(REPLCodePtr::BuiltInProperty) =>
clause_name!("$cpp_built_in_property"),
+ &SystemClauseType::REPL(REPLCodePtr::DynamicProperty) =>
+ clause_name!("$cpp_dynamic_property"),
+ &SystemClauseType::REPL(REPLCodePtr::MultifileProperty) =>
+ clause_name!("$cpp_multifile_property"),
+ &SystemClauseType::REPL(REPLCodePtr::DiscontiguousProperty) =>
+ clause_name!("$cpp_discontiguous_property"),
&SystemClauseType::REPL(REPLCodePtr::CompilePendingPredicates) =>
clause_name!("$compile_pending_predicates"),
&SystemClauseType::Close => clause_name!("$close"),
("$prolog_lc_stream", 1) => Some(SystemClauseType::REPL(REPLCodePtr::LoadContextStream)),
("$cpp_meta_predicate_property", 4) => Some(SystemClauseType::REPL(REPLCodePtr::MetaPredicateProperty)),
("$cpp_built_in_property", 2) => Some(SystemClauseType::REPL(REPLCodePtr::BuiltInProperty)),
+ ("$cpp_dynamic_property", 3) => Some(SystemClauseType::REPL(REPLCodePtr::DynamicProperty)),
+ ("$cpp_multifile_property", 3) => Some(SystemClauseType::REPL(REPLCodePtr::MultifileProperty)),
+ ("$cpp_discontiguous_property", 3) => Some(SystemClauseType::REPL(REPLCodePtr::DiscontiguousProperty)),
("$compile_pending_predicates", 1) => Some(SystemClauseType::REPL(REPLCodePtr::CompilePendingPredicates)),
_ => None,
}
'$cpp_meta_predicate_property'(Module, Name, Arity, MetaPredicateTerm).
check_predicate_property(built_in, _, Name, Arity, built_in) :-
'$cpp_built_in_property'(Name, Arity).
+check_predicate_property(dynamic, Module, Name, Arity, dynamic) :-
+ '$cpp_dynamic_property'(Module, Name, Arity).
+check_predicate_property(multifile, Module, Name, Arity, multifile) :-
+ '$cpp_multifile_property'(Module, Name, Arity).
+check_predicate_property(discontiguous, Module, Name, Arity, multifile) :-
+ '$cpp_discontiguous_property'(Module, Name, Arity).
+
extract_predicate_property(Property, PropertyType) :-
; Callable =.. [(:), Module, Callable0],
atom(Module) ->
functor(Callable0, Name, Arity),
- extract_predicate_property(Property, PropertyType),
- check_predicate_property(PropertyType, Module, Name, Arity, Property)
+ ( atom(Name),
+ Name \== [] ->
+ extract_predicate_property(Property, PropertyType),
+ check_predicate_property(PropertyType, Module, Name, Arity, Property)
+ ; type_error(callable, Callable0, predicate_property/2)
+ )
; functor(Callable, Name, Arity),
- extract_predicate_property(Property, PropertyType),
- load_context(Module),
- check_predicate_property(PropertyType, Module, Name, Arity, Property)
+ ( atom(Name),
+ Name \== [] ->
+ extract_predicate_property(Property, PropertyType),
+ load_context(Module),
+ check_predicate_property(PropertyType, Module, Name, Arity, Property)
+ ; type_error(callable, Callable, predicate_property/2)
+ )
).
}
}
}
+
// TODO: necessary? unnecessary?
// self.wam.code_repo.code.truncate(self.retraction_info.orig_code_extent);
}
}
}
+ pub(crate)
+ fn dynamic_property(&mut self) {
+ let module_name = atom_from!(
+ self.machine_st,
+ self.machine_st.store(self.machine_st.deref(
+ self.machine_st[temp_v!(1)]
+ ))
+ );
+
+ let key =
+ self.machine_st.read_predicate_key(
+ self.machine_st[temp_v!(2)],
+ self.machine_st[temp_v!(3)],
+ );
+
+ let compilation_target =
+ match module_name.as_str() {
+ "user" => CompilationTarget::User,
+ _ => CompilationTarget::Module(module_name),
+ };
+
+ match self.indices.get_predicate_skeleton(
+ &compilation_target,
+ &key,
+ ) {
+ Some(skeleton) => {
+ self.machine_st.fail = !skeleton.is_dynamic;
+ }
+ None => {
+ self.machine_st.fail = true;
+ }
+ }
+ }
+
+ pub(crate)
+ fn multifile_property(&mut self) {
+ let module_name = atom_from!(
+ self.machine_st,
+ self.machine_st.store(self.machine_st.deref(
+ self.machine_st[temp_v!(1)]
+ ))
+ );
+
+ let key =
+ self.machine_st.read_predicate_key(
+ self.machine_st[temp_v!(2)],
+ self.machine_st[temp_v!(3)],
+ );
+
+ let compilation_target =
+ match module_name.as_str() {
+ "user" => CompilationTarget::User,
+ _ => CompilationTarget::Module(module_name),
+ };
+
+ match self.indices.get_predicate_skeleton(
+ &compilation_target,
+ &key,
+ ) {
+ Some(skeleton) => {
+ self.machine_st.fail = !skeleton.is_multifile;
+ }
+ None => {
+ self.machine_st.fail = true;
+ }
+ }
+ }
+
+ pub(crate)
+ fn discontiguous_property(&mut self) {
+ let module_name = atom_from!(
+ self.machine_st,
+ self.machine_st.store(self.machine_st.deref(
+ self.machine_st[temp_v!(1)]
+ ))
+ );
+
+ let key =
+ self.machine_st.read_predicate_key(
+ self.machine_st[temp_v!(2)],
+ self.machine_st[temp_v!(3)],
+ );
+
+ let compilation_target =
+ match module_name.as_str() {
+ "user" => CompilationTarget::User,
+ _ => CompilationTarget::Module(module_name),
+ };
+
+ match self.indices.get_predicate_skeleton(
+ &compilation_target,
+ &key,
+ ) {
+ Some(skeleton) => {
+ self.machine_st.fail = !skeleton.is_discontiguous;
+ }
+ None => {
+ self.machine_st.fail = true;
+ }
+ }
+ }
+
pub(crate)
fn builtin_property(&mut self) {
let key =
AddDynamicPredicate,
AddGoalExpansionClause,
AddTermExpansionClause,
- BuiltInProperty,
ClauseToEvacuable,
ConcludeLoad,
DeclareModule,
PushLoadContext,
PushLoadStatePayload,
UseModule,
+ BuiltInProperty,
MetaPredicateProperty,
+ MultifileProperty,
+ DiscontiguousProperty,
+ DynamicProperty,
CompilePendingPredicates,
UserAsserta,
UserAssertz,
for arity in 1 .. 66 {
let key = (clause_name!("call"), arity);
- match loader.code_dir.get(&key).cloned() {
+ match loader.code_dir.get(&key) {
Some(src_code_index) => {
let target_code_index = target_module.code_dir
.entry(key.clone())
REPLCodePtr::BuiltInProperty => {
self.builtin_property();
}
+ REPLCodePtr::MultifileProperty => {
+ self.multifile_property();
+ }
+ REPLCodePtr::DiscontiguousProperty => {
+ self.discontiguous_property();
+ }
+ REPLCodePtr::DynamicProperty => {
+ self.dynamic_property();
+ }
REPLCodePtr::CompilePendingPredicates => {
self.compile_pending_predicates();
}
write!(f, "REPLCodePtr::AddGoalExpansionClause"),
REPLCodePtr::AddTermExpansionClause =>
write!(f, "REPLCodePtr::AddTermExpansionClause"),
- REPLCodePtr::BuiltInProperty =>
- write!(f, "REPLCodePtr::BuiltInProperty"),
REPLCodePtr::UserAssertz =>
write!(f, "REPLCodePtr::UserAssertz"),
REPLCodePtr::UserAsserta =>
write!(f, "REPLCodePtr::UseModule"),
REPLCodePtr::MetaPredicateProperty =>
write!(f, "REPLCodePtr::MetaPredicateProperty"),
+ REPLCodePtr::BuiltInProperty =>
+ write!(f, "REPLCodePtr::BuiltInProperty"),
+ REPLCodePtr::DynamicProperty =>
+ write!(f, "REPLCodePtr::DynamicProperty"),
+ REPLCodePtr::MultifileProperty =>
+ write!(f, "REPLCodePtr::MultifileProperty"),
+ REPLCodePtr::DiscontiguousProperty =>
+ write!(f, "REPLCodePtr::DiscontiguousProperty"),
REPLCodePtr::CompilePendingPredicates =>
write!(f, "REPLCodePtr::CompilePendingPredicates"),
}