142 lines
2.9 KiB
Prolog
142 lines
2.9 KiB
Prolog
:-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.
|
|
|