142 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Perl
		
	
	
	
	
	
		
		
			
		
	
	
			142 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Perl
		
	
	
	
	
	
|   | :-use_module(library(system)). | ||
|  | %:-use_module(library(clib)). | ||
|  | 
 | ||
|  | bdd_init(FDO, FDI, PID):- | ||
|  |   exec('/home/theo/BDDs/SimpleCUDD/Version4/Example -online', [pipe(FDO), pipe(FDI), std], PID). | ||
|  |   %process_create('/home/theo/BDDs/SimpleCUDD/Version3/Example', ['-online'], [stdin(pipe(FDI)), stdout(pipe(FDO)), process(PID)]). | ||
|  | 
 | ||
|  | bdd_commit(FDO, LINE):- | ||
|  |   write(FDO, LINE), | ||
|  |   write(FDO, '\n'). | ||
|  | 
 | ||
|  | bdd_kill(FDO, FDI, PID, S):- | ||
|  |   bdd_commit(FDO, '@e'), | ||
|  |   wait(PID, S), | ||
|  |   %process_wait(PID, S), | ||
|  |   close(FDO), | ||
|  |   close(FDI). | ||
|  | 
 | ||
|  | bdd_line([], X, _, L):- | ||
|  |   atomic(X), | ||
|  |   X \= [], | ||
|  |   (bdd_curinter(N) -> | ||
|  |     retract(bdd_curinter(N)) | ||
|  |   ; | ||
|  |     N = 1 | ||
|  |   ), | ||
|  |   M is N + 1, | ||
|  |   assert(bdd_curinter(M)), | ||
|  |   atomic_concat(['L', N, '=', X], L). | ||
|  | 
 | ||
|  | bdd_line(L, X, O, NL):- | ||
|  |   atomic(X), | ||
|  |   X \= [], | ||
|  |   atom(L), | ||
|  |   L \= [], | ||
|  |   atomic_concat([L, O, X], NL). | ||
|  | 
 | ||
|  | bdd_line(L, [], _, L):-!. | ||
|  | 
 | ||
|  | bdd_line(L, [X|T], O, R):- | ||
|  |   bdd_line(L, X, O, NL), | ||
|  |   bdd_line(NL, T, O, R). | ||
|  | 
 | ||
|  | bdd_AND(L, X, NL):- | ||
|  |   bdd_line(L, X, '*', NL). | ||
|  | bdd_OR(L, X, NL):- | ||
|  |   bdd_line(L, X, '+', NL). | ||
|  | bdd_XOR(L, X, NL):- | ||
|  |   bdd_line(L, X, '#', NL). | ||
|  | bdd_NAND(L, X, NL):- | ||
|  |   bdd_line(L, X, '~*', NL). | ||
|  | bdd_NOR(L, X, NL):- | ||
|  |   bdd_line(L, X, '~+', NL). | ||
|  | bdd_XNOR(L, X, NL):- | ||
|  |   bdd_line(L, X, '~#', NL). | ||
|  | 
 | ||
|  | bdd_not(X, NX):- | ||
|  |   atomic(X), | ||
|  |   atomic_concat(['~', X], NX). | ||
|  | 
 | ||
|  | bdd_laststep(L):- | ||
|  |   bdd_curinter(N), | ||
|  |   M is N - 1, | ||
|  |   atomic_concat(['L', M], L), | ||
|  |   !. | ||
|  | 
 | ||
|  | bdd_nextDFS(FDO):- | ||
|  |   bdd_commit(FDO, '@n'). | ||
|  | 
 | ||
|  | bdd_nextBFS(FDO):- | ||
|  |   bdd_commit(FDO, '@n,BFS'). | ||
|  | 
 | ||
|  | bdd_current(FDO, FDI, N, Qcnt):- | ||
|  |   bdd_commit(FDO, '@c'), | ||
|  |   read(FDI, F), | ||
|  |   assert(F), | ||
|  |   bdd_temp_value(N, Qcnt), | ||
|  |   retract(F). | ||
|  | 
 | ||
|  | bdd_highnodeof(FDO, FDI, H):- | ||
|  |   bdd_commit(FDO, '@h'), | ||
|  |   read(FDI, F), | ||
|  |   assert(F), | ||
|  |   bdd_temp_value(H), | ||
|  |   retract(F). | ||
|  | 
 | ||
|  | bdd_lownodeof(FDO, FDI, L):- | ||
|  |   bdd_commit(FDO, '@l'), | ||
|  |   read(FDI, F), | ||
|  |   assert(F), | ||
|  |   bdd_temp_value(L), | ||
|  |   retract(F). | ||
|  | 
 | ||
|  | bdd_nodevaluesof(FDO, FDI, N, V):- | ||
|  |   atomic_concat(['@v,', N], Q), | ||
|  |   bdd_commit(FDO, Q), | ||
|  |   read(FDI, F), | ||
|  |   assert(F), | ||
|  |   bdd_temp_value(V), | ||
|  |   retract(F). | ||
|  | /* | ||
|  | bdd_addnodetohis(FDO, N, [D, I, Dyn]):- | ||
|  |   atomic_concat(['@a,', N, ',', D, ',', I, ',', Dyn], Q), | ||
|  |   bdd_commit(FDO, Q). | ||
|  | 
 | ||
|  | bdd_getnodefromhis(FDO, FDI, N, V):- | ||
|  |   atomic_concat(['@g,', N], Q), | ||
|  |   bdd_commit(FDO, Q), | ||
|  |   read(FDI, F), | ||
|  |   assert(F), | ||
|  |   bdd_temp_value(V), | ||
|  |   retract(F). | ||
|  | */ | ||
|  | 
 | ||
|  | runme:- | ||
|  |   bdd_init(FDO, FDI, PID), | ||
|  |   bdd_AND([], ['A', 'B', 'C', 'D', 'E'], L1), | ||
|  |   bdd_laststep(L1S), | ||
|  |   bdd_commit(FDO, L1), | ||
|  |   bdd_AND([], ['A', 'F', 'G', '~B'], L2), | ||
|  |   bdd_laststep(L2S), | ||
|  |   bdd_commit(FDO, L2), | ||
|  |   bdd_AND([], ['A', 'F', 'G', '~C'], L3), | ||
|  |   bdd_laststep(L3S), | ||
|  |   bdd_commit(FDO, L3), | ||
|  |   bdd_OR([], [L1S, L2S, L3S], L4), | ||
|  |   bdd_laststep(L4S), | ||
|  |   bdd_commit(FDO, L4), | ||
|  |   bdd_commit(FDO, L4S), | ||
|  | 
 | ||
|  |   repeat, | ||
|  |   bdd_current(FDO, FDI, N, I), | ||
|  |   write(1),nl, | ||
|  |   bdd_nodevaluesof(FDO, FDI, N, V), | ||
|  |   write(N), write(' ('), write(V), write(')'), nl, | ||
|  |   bdd_next(FDO), | ||
|  |   I = 0, (N = 'TRUE' ; N = 'FALSE'), | ||
|  | 
 | ||
|  |   bdd_kill(FDO, FDI, PID, S), | ||
|  |   write('BDD terminated with state: '), write(S), nl. | ||
|  | 
 |