Sto provando a scrivere un algoritmo che cerca ingenuamente modelli di una formula booleana (NNF, ma non CNF).Risolutore Prolog solutore di forza Brute-force per formule booleane
Il codice che ho può controllare un modello esistente, ma sarà a mancare (o non finire) quando viene chiesto di trovare modelli, apparentemente perché genera infinite soluzioni per member(X, Y)
lungo le linee di [X|_], [_,X|_], [_,_,X|_]...
Quello che ho hanno finora è questo:
:- op(100, fy, ~).
:- op(200, xfx, /\).
:- op(200, xfx, \/).
:- op(300, xfx, =>).
:- op(300, xfx, <=>).
formula(X) :- atom(X).
formula(~X) :- formula(X).
formula(X /\ Y) :- formula(X), formula(Y).
formula(X \/ Y) :- formula(X), formula(Y).
formula(X => Y) :- formula(X), formula(Y).
formula(X <=> Y) :- formula(X), formula(Y).
model(1, _).
model(X, F) :- atom(X), member([X, 1], F).
model(~X, F) :- atom(X), member([X, 0], F). % NNF
model(A /\ B, F) :- model(A, F), model(B, F).
model(A \/ B, F) :- (model(A, F); model(B, F)).
model(A => B, F) :- model(~A \/ B, F).
model(A <=> B, F) :- model((A => B) /\ (B => A), F).
sat(A) :- model(A, F), \+ (member([X, 1], F), member([X, 0], F)).
%%% examples:
% formula(~(~ (a /\ b) \/ (c => d))).
% model(a, [[a,1]]).
c'è una struttura di dati migliore per la F
, o qualche altro modo le liste parzialmente istanziati possono essere tagliati fuori?
Modifica: aggiunte definizioni ed esempi.
Si prega di rendere il vostro codice autonomo, in modo che altri possano effettivamente provarlo. – mat
Mi spiace, ho modificato il resto del codice. –
Un commento sulla rappresentazione: sai che ciascuna di queste liste ha esattamente 2 elementi. In questi casi, è meglio usare termini come 'x = 0',' x = 1' per rappresentare i collegamenti in modo più compatto: '[x, 0]' è '. (X,.(0, []) ', sprecando spazio per un ulteriore functor'./2' e un atomo '[]' per ciascuna di tali strutture. Al contrario, 'x = 0' è' = (x, 0) ', cioè un solo functor e i suoi due argomenti. Come altri hanno già detto, è possibile delegare facilmente il binding a Prolog utilizzando invece le variabili logiche reali. È possibile memorizzare una corrispondenza simbolo/variabile anziché una variabile/valore! – mat