/*-------------------------------------------------------------------------*/
/* Prolog to Wam Compiler INRIA Rocquencourt - ChLoE Project */
/* Buit-In Predicates Daniel Diaz - 1994 */
/* */
/* Dynamic code management */
/* */
/* assert.pl */
/*-------------------------------------------------------------------------*/
/* dynamic clauses (assert, retract, clause, abolish,...) */
:- public asserta/1, assertz/1, clause/2, clause1/1, retract/1,
abolish/1, abolish/2,
reinit_predicate/1, reinit_predicate/2.
asserta(C):-
(C=(H:-B) ; C=H, B=true),
!,
asserta1([H|B]).
asserta1(_C):-
pragma_c('Asserta1_1').
assertz(C):-
(C=(H:-B) ; C=H, B=true),
!,
assertz1([H|B]).
assertz1(_C):-
pragma_c('Assertz1_1').
clause(H,B):-
clause1([H|B]).
clause1(_C):-
pragma_c('Clause1_1').
retract(C):-
(C=(H:-B) ; C=H, B=true),
!,
clause1([H|B]),
pragma_c('Retract_0').
abolish(F/N):-
abolish(F,N).
abolish(_F,_N):-
pragma_c('Abolish_2').
reinit_predicate(F/N):-
reinit_predicate(F,N,2).
reinit_predicate(F,N):-
reinit_predicate(F,N,2).
reinit_predicate(_F,_N,_WhatToDo):-
pragma_c('Reinit_Predicate_3').
/* consult */
:- public '.'/2, consult/1.
[File|Files]:-
consult(File),
consult(Files).
consult([]):-
!.
consult([File|Files]):-
!,
consult(File),
consult(Files).
consult(File):-
pragma_c('New_Consult_0'),
(File==user -> File1=user
; prolog_file_name(File,File1)),
see(File1),
repeat,
read_term(C,[singletons(SingNames)]),
(C\==end_of_file
-> (C=(:- Direc) -> exec_directive(Direc)
; add_clause(C,SingNames)),
fail
;
!,
seen).
prolog_file_name(File,File1):-
atom_length(File,L),
P is L-2,
(sub_atom(File,P,3,'.pl')
-> File1=File
; atom_concat(File,'.pl',File1)).
exec_directive(C):-
functor(C,F,N),
((F==main, N=<2) ; (F==(public), N==1)),
formata('Warning: directive <~w> ignored~n',[C]),
!.
exec_directive(C):-
(call(C) -> true
; formata('Warning: directive <~w> failed~n',[C])).
add_clause(C,SingNames):-
(C=(H:-B) ; C=H, B=true),
!,
functor(H,F,N),
get_singletons(SingNames,Sing),
(Sing\==[]
-> formata('{Warning: ~w - singleton variables in ~a/~d}~n',
[Sing,F,N])
; true),
reinit_predicate(F,N,1),
assertz1([H|B]).
get_singletons([],[]).
get_singletons([X=_|SingNames],Sing1):-
(sub_atom(X,1,1,'_') -> Sing1=Sing
; Sing1=[X|Sing]),
get_singletons(SingNames,Sing).
/* listing */
:- public listing/1.
listing(F/N):-
functor(H,F,N),
(clause(H,B),
pp_clause(H,B),
fail
;
true).
syntax highlighted by Code2HTML, v. 0.9.1