13 op(
1060, xfx, such_that),
14 op(
1050, xfx, extra_arguments),
15 op(
1050, xfx, defaults),
71:-
list2conj/2
conj2list/2
use_module( library(clauses),
83:-
dynamic extension/4,
init/2,
frame/2,
exclusive/0.
86 Term = (
Spec :- Body),
88 extension(
Mod:Spec,
Tests,
GoalVars,
Names),
89 extension
:context_variables(
UnsortedCurrentNames),
90 sort(
UnsortedCurrentNames,
CurrentNames ),
91 merge_variables(
Names,
CurrentNames ),
92 findall( (
Mod:ExtHead :- ExtBody),
93 expand(
Spec,
Names,
GoalVars,
Body,
Tests, (
ExtHead :- ExtBody)),
96find_name( [
Name=V0|_] ,
V,
Name)
:- V=V0,
find_name.
97find_name( [
_|UnsortedCurrentNames] ,
V,
Name)
:-
98 find_name(
UnsortedCurrentNames ,
V,
Name).
100expand(
Skel,
Names,
GoalVars,
Body,
Tests,
Out)
:-
105 maplist(original_name(
GoalVars),
Names,
Ts),
106 LinkGoal =.. [access
|Ts],
108 formula(
Tests,
Fs,
Dic),
110 bdd_print(
BDD,
'/Users/vsc/bdd.dot',
Names),
112 ptree(
Tree,
Names,
Dic),
114 unnumbervars((
Head:- LinkGoal,
Body),
Out).
118ptree( bdd(
Root,
L,
_Vs) ,
Names,
File,
Dic)
:-
121 maplist( bindv,
Names),
123 maplist( bindv,
Pairs),
125 open(
AbsFile, write,
S) ,
174pick(
Els,
_As,
Names)
:-
177fetch_var(
V,
V)
:- var(
V),
var.
178fetch_var(
_:_=V,
V)
:- var(
V),
var.
179fetch_var(
_=V,
V)
:- var(
V),
var.
181original_name(
_,
V,
V)
:- var(
V),
var.
182original_name(
HVs,
_ID:Name=V,
V)
:- vmemberck(
V,
HVs),
vmemberck,
V='$VAR'(
Name).
183original_name(
HVs,
Name=V,
V)
:- vmemberchk(
V,
HVs),
vmemberchk,
V='$VAR'(
Name).
184original_name(
_HVs,
_,
_V).
187vmemberchk(
V,[
V0|_])
:- V == V0,
vmemberchk.
188vmemberchk(
V,[
_V0|Vs])
:-
202new_test(
Test,
B,
OUT )
:-
203 pre_evaluate(
Test,
O ),
205 (
O == true
-> OUT = B ;
206 O == false
-> warning( inconsistent_test(
Test ) )
;
207 O \= warning
-> OUT = (
O ,
B ) ).
209new_test(
Test,
B, (
Test,
B) )
:-
210 warning( unimplemented_test(
Test ) ).
213pre_evaluate(
V?=
C, true )
:- var(
V),
var,
V = C.
214pre_evaluate(
_V?=
_C, true ).
215pre_evaluate(
V=C, true )
:- nonvar(
V),
V \= '$VAR'(
_),
'$VAR',
V = C.
216pre_evaluate(
V=_C, false )
:- var(
V),
var.
217pre_evaluate(
V=C,
V=C ).
218pre_evaluate( var(
V), true )
:- var(
V),
var.
219pre_evaluate( var(
T), false )
:- T \= '$VAR'(
_),
'$VAR'.
220pre_evaluate( var(
T), var(
T) )
:- pre_evaluate.
221pre_evaluate(
A*B,
O )
:-
222 pre_evaluate(
A,
O1),
223 pre_evaluate(
B,
O2),
224 (
O1 == false
-> O = false
;
225 O1 == true
-> O = O2 ;
226 O2 == false
-> O = false
;
227 O2 == true
-> O = O1 ;
229pre_evaluate(
A+B,
O )
:-
230 pre_evaluate(
A,
O1),
231 pre_evaluate(
B,
O2),
232 (
O1 == true
-> O = true
;
233 O1 == false
-> O = O2 ;
234 O2 == true
-> O = true
;
235 O2 == false
-> O = O1 ;
237pre_evaluate(
G,
O )
:-
238 type_domain_goal(
G,
Parameter ),
type_domain_goal,
239 (
var(
Parameter )
-> O = var
;
240 Parameter = '$VAR'(
_)
-> O = G ;
241 call(
G )
-> O = call
; O = call).
242pre_evaluate( (
G1 ==>
G2),
O )
:-
243 pre_evaluate(
G1,
O1 ),
244 (
O1 = false
-> O = true
;
245 pre_evaluate(
G2,
O2 ),
246 (
O1 == true
-> O = O2 ;
248 (
O1 = false
-> O = true
249 ; O = (
O1 -> error(
O2)
; error ) )
;
250 O2 == true
-> O = true
;
251 O = (
O1 -> (
O2 ; )
; true ) ) ).
252pre_evaluate( c
^G,
G ).
253pre_evaluate( (
G1 #==>
G2),
O )
:-
254 pre_evaluate(
G1,
O1 ),
255 (
O1 = false
-> O = true
;
256 O1 = true
-> O = G2 ;
257 O = (
O1 -> G2 ; true ) ).
259type_domain_goal( nonvar(
Parameter),
Parameter).
260type_domain_goal( atom(
Parameter),
Parameter).
261type_domain_goal( atomic(
Parameter),
Parameter).
262type_domain_goal( number(
Parameter),
Parameter).
263type_domain_goal( float(
Parameter),
Parameter).
264type_domain_goal( nonvar(
Parameter),
Parameter).
265type_domain_goal( compound(
Parameter),
Parameter).
266type_domain_goal( is_list(
Parameter),
Parameter).
267type_domain_goal( integer(
Parameter),
Parameter).
268type_domain_goal( internet_host(
Parameter),
Parameter).
269type_domain_goal( positive_or_zero_integer(
Parameter),
Parameter).
270type_domain_goal( file(
Parameter),
Parameter).
271type_domain_goal(
Parameter = A,
Parameter)
:- atomic(
A),
atomic.
272type_domain_goal(
A = Parameter,
Parameter)
:- atomic(
A).
273type_domain_goal(
Parameter in
_ ,
Parameter).
275new_init(
_,
_ = G,
B,
B )
:- var(
G),
var.
276new_init(
_,
_ = G,
B,
B )
:- G \= '$VAR'(
_),
'$VAR'.
277new_init(
Vs,
_ = Val, (
Var = Val,
B),
B )
:-
278 member(
Var = Val,
Vs ),
member.
281merge_variables( [],
_CurrentNames ).
282merge_variables(
_Names, [] ).
283merge_variables( [
S0=V0|Names], [
S1=V1|CurrentNames] )
:-
284 compare(
Diff,
S0,
S1),
285 (
Diff == (
=)
-> V0 = V1,
merge_variables(
Names,
CurrentNames )
;
286 Diff == (
>)
-> merge_variables( [
S0=V0|Names],
CurrentNames )
;
287 merge_variables(
Names, [
S1=V1|CurrentNames] ) ).
295 conj2list
:context_variables(
Names),
296 strip_module(
ModName ,
Mod,
NameArity ),
297 assert( extension(
Mod:NameArity,
Cs,
Vs,
Names) ).
307satisfy((
A ==>
C))
:-
308 satisfy(
A)
-> satisfy(
C).
309satisfy(domain(
X,
Vs))
:-
313satisfy(integer(
X))
:-
317satisfy(internet_host(
X))
:-
320 X = ipv4(
I1,
I2,
I3,
I4),
325satisfy(positive_or_zero_integer(
X))
:-
341 satisfy(
A)
-> ensure(
C).
342ensure(domain(
X,
Vs))
:-
344 var(
X)
-> error(instantiation_error)
346 satisfy( member(
X,
Vs) )
-> satisfy
; error(domain_error(
Vs,
X))
350 var(
X)
-> error(instantiation_error)
354 error(type_error(atom,
X))
358 var(
X)
-> error(instantiation_error)
362 error(type_error(integer,
X))
364ensure(internet_host(
X))
:-
366 var(
X)
-> error(instantiation_error)
370 X = ipv4(
I1,
I2,
I3,
I4),
378 error(type_error(atom,
X))
380ensure(positive_or_zero_integer(
X))
:-
382 var(
X)
-> error(instantiation_error)
384 \+ integer(
X)
-> error(type_error(integer,
X))
386 X < 0 -> throw(domain_error(not_less_than_zero,
X))
392 var(
X)
-> error(instantiation_error)
396 error(type_error(atom,
X))
400 var(
X)
-> error(instantiation_error)
406 error(domain_error(
D,
X))
410formula(
Axioms,
FormulaE,
Dic)
:-
413 foldl2( eq,
Goals,
Formula,
Dic0,
Dic, [],
Extras),
414 append(
Formula,
Extras,
FormulaL),
415 list2prod(
FormulaL,
FormulaE).
417is_frame(
A =:= B )
:- assert( frame(
A,
B)).
418is_frame( level(
N, [
H|L]) )
:- _frame,
maplist( assertn(level,
N), [
H|L] ).
419is_frame( level(
N,
L ) )
:- assert( level(
N,
L) ).
421assertn(level,
N,
L)
:- assert( level(
N,
L) ).
425list2prod( [
F1,
F2|Fs],
F1*NF)
:-
426 list2prod( [
F2|Fs],
NF).
429eq(
1,
1,
Dic,
Dic,
I,
I)
:- eq.
430eq(
X,
VX,
Dic0,
Dic,
I0,
I)
:- var(
X),
var,
431 add(
X,
VX,
Dic0,
Dic,
I0,
I).
432eq(
X == Exp, (
-TA + TY)
*(
-TY + TA),
Dic0,
Dic,
I0,
I)
:- eq,
433 eq(
X,
TA,
Dic0,
Dic1,
I0,
I1),
434 eq(
Exp,
TY,
Dic1,
Dic,
I1,
I).
436eq((
X ==>
Y), (
-TX + TY),
Dic0,
Dic,
I0,
I)
:- eq,
437 eq(
X,
TX,
Dic0,
Dic1,
I0,
I1),
438 eq(
Y,
TY,
Dic1,
Dic,
I1,
I).
440eq((
X :- Y), (
TX + -TY),
Dic0,
Dic,
I0,
I)
:- eq,
441eq(
X,
TX,
Dic0,
Dic1,
I0,
I1),
442eq(
Y,
TY,
Dic1,
Dic,
I1,
I).
444eq((
X + Y), (
TX + TY),
Dic0,
Dic,
I0,
I)
:- eq,
445 eq(
X,
TX,
Dic0,
Dic1,
I0,
I1),
446 eq(
Y,
TY,
Dic1,
Dic,
I1,
I).
448eq((
X * Y), (
TX * TY),
Dic0,
Dic,
I0,
I)
:- eq,
449 eq(
X,
TX,
Dic0,
Dic1,
I0,
I1),
450 eq(
Y,
TY,
Dic1,
Dic,
I1,
I).
452eq(
-X,
-TX,
Dic0,
Dic,
I0,
I)
:- eq,
453 eq(
X,
TX,
Dic0,
Dic,
I0,
I).
455eq((
X xor
Y), (
TX xor
TY),
Dic0,
Dic,
I0,
I)
:- eq,
456 eq(
X,
TX,
Dic0,
Dic1,
I0,
I1),
457 eq(
Y,
TY,
Dic1,
Dic,
I1,
I).
459eq(
X in
D,
VX = (
TAX + (
-TAX * (
EDX+ (
-EDX * Ds )))) ,
Dic0,
Dic,
I0,
I)
:- eq,
460 eq( t_atom(
X),
TAX,
Dic0,
Dic1,
I0,
I1),
461 add( err(dom(
X,
D)),
EDX,
Dic1,
Dic2,
I1,
I2),
462 add(
X,
VX,
Dic2,
Dic3,
I2,
I3),
463 t_domain(
D,
X,
VX,
Ds,
Dic3,
Dic,
I3,
I).
465eq(one_of(
D),
Ds,
Dic0,
Dic,
I0,
I)
:-
467 t_domain0(
D,
Ds,
Dic0,
Dic,
I0,
I).
469eq(
G,
NG,
Dic0,
Dic,
I0,
I)
:-
470 add(
G,
NG,
Dic0,
Dic,
I0,
I).
472add_xors(
L,
V,
I0,
I)
:-
473 foldl(add_xor(
V),
L,
I0,
I).
475add_xor(
V,
V0,
I,
I)
:- V == V0,
add_xor.
476add_xor(
V,
V0,
I, [(
V-V0)
|I]).
478xor(
VX,
DV0s,
DV ,
Disj0,
Disj0+Conj)
:- xor,
479 foldl( add_all2(
VX,
DV),
DV0s,
1,
Conj).
481add_all2(
VX,
G,
GD,
C,
C*(
VX=G)
482 )
:- G == GD,
add_all2 .
483add_all2(
VX,
_,
G,
C,
C*(
-(
VX=G))).
485list2prod(
X,
P,
X *P).
488t_domain0( [
D],
DX,
Dic0,
Dic,
I0,
I)
:- t_domain0,
489 eq(
D ,
DX ,
Dic0,
Dic,
I0,
I).
490t_domain0( [
D1|D2s], (
DX1+ (
-DX1*D2Xs)),
Dic0,
Dic,
I0,
I)
:-
491 eq(
D1,
DX1,
Dic0,
Dic1,
I0,
I1),
492 t_domain0(
D2s,
D2Xs,
Dic1,
Dic,
I1,
I).
494t_domain( [
D],
X,
_VX,
VDX,
Dic0,
Dic,
I0,
I)
:- t_domain,
495 add(
X=D,
VDX,
Dic0,
Dic,
I0,
I).
496t_domain( [
D1|D2s],
X,
VX,
VDX + (
-VDX*D2S),
Dic0,
Dic,
I0,
I)
:-
497 add(
X=D1,
VDX,
Dic0,
Dic1,
I0,
I1),
498 t_domain(
D2s,
X,
VX,
D2S,
Dic1,
Dic,
I1,
I ).
500t_domain0( [
D],
VDX,
Dic0,
Dic,
I0,
I)
:-
502 add(
D,
VDX,
Dic0,
Dic,
I0,
I).
503t_domain0( [
D1|D2s],
VDX + (
-VDX*D2S),
Dic0,
Dic,
I0,
I)
:-
504 add(
D1,
VDX,
Dic0,
Dic1,
I0,
I1),
505 t_domain0(
D2s,
D2S,
Dic1,
Dic,
I1,
I ).
507add(
AG,
V,
Dic,
Dic,
I,
I)
:-
509add(
AG,
V,
Dic0,
Dic,
I0,
IF)
:-
510 frame(
AG,
Body),
frame,
512 eq(
AG==Body,
O,
Dic1,
Dic, [
O|I0],
IF).
513add(
AG,
V,
Dic0,
Dic,
I,
I)
:-
516simp_key(
G ,
G)
:- var(
G),
var.
517simp_key(
_^_:error(
_^G) ,
G)
:- simp_key.
518simp_key(
_^_:G ,
G)
:- simp_key.
519simp_key(
'$VAR'(
S)
:A,
SAG)
:-
523simp_key(
V:error(
E), error(
V,
E))
:- simp_key.
528 all_pairs(
L, [],
Ps),
529 foldl( pair2cs,
Ps, true,
Cs).
531all_pairs([
X,
Y|L],
E0,
E)
:-
532 all_pairs([
X|L], [[
X|Y]
|E0],
E1),
533 all_pairs([
Y|L],
E1,
E).
534all_pairs([
_X],
E,
E).
536pair2cs([
X|Y],
P,
P*(
X-> -Y)
* (
Y -> -X)).
540atom(
AA,
VD,
CS, (
VD->AA)
*CS).
545absolute_file_name( -File:atom, +Path:atom, +Options:list)
prolog_load_context(? Key, ? Value)
term_variables(? Term, - Variables)
append(? List1,? List2,? List3)
member(?Element, ?Set) is true when Set is a list, and Element occurs in it
memberchk(+ Element, + Set)
maplist( 2:Pred, + List1,+ List2)
partition(1:Pred, + List1, ? Included, ? Excluded)
rb_insert(+ T0,+ Key,? Value,+ TF)
rb_lookup(+Key, -Value, +T)