-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathload_simple.pl
executable file
·46 lines (37 loc) · 1.05 KB
/
load_simple.pl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
:- module(load_simple, [load_file/1,my_clause/3], [assertions, isomodes, doccomments, dynamic]).
%! \title Simple program loader
%
% \module
% Load clauses in `my_clause/3` (keeps a unique identifer for each
% clause). Drops any `:- _` declaration.
:- dynamic my_clause/3.
:- use_module(library(streams)).
:- use_module(library(lists)).
:- use_module(library(read)).
:- use_module(common, [conj2List/2]).
load_file(F) :-
retractall(my_clause(_,_,_)),
open(F,read,S),
remember_all(S,1),
close(S).
remember_all(S,K) :-
read(S,C),
( C == end_of_file ->
true
; remember_clause(C,K),
K1 is K+1,
remember_all(S,K1)
).
remember_clause(A, _) :- var(A), !. % Drop
remember_clause((:- _), _):- !. % Drop all non-execute/specialize clauses
remember_clause((A :- B), K) :- !,
conj2List(B,BL),
makeClauseId(K,CK),
assertz(my_clause(A,BL,CK)).
remember_clause(A,K) :-
makeClauseId(K,CK),
assertz(my_clause(A,[],CK)).
makeClauseId(K,CK) :-
name(K,NK),
append("c",NK,CNK),
name(CK,CNK).