Próbuję napisać algorytm, który naiwnie szuka modeli formuły logicznej (NNF, ale nie CNF).Brut-force Prolog Rozwiązywanie problemów SAT dla formuł logicznych
Kod mam może sprawdzić istniejący model, ale to nie (lub nie zakończyć) pytany, aby znaleźć modele, z pozoru, ponieważ generuje on nieskończenie wiele rozwiązań dla member(X, Y)
wzdłuż linii [X|_], [_,X|_], [_,_,X|_]...
Co ja do tej pory to:
:- 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]]).
Czy istnieje lepsza struktura danych dla F
, lub jakiś inny sposób, że częściowo wystąpienia listy mogą zostać odcięte?
Edytuj: Dodano definicje i przykłady.
Proszę utwórz kod w taki sposób, aby inni mogli go wypróbować. – mat
Przepraszam, redagowałem w pozostałej części kodu. –
Jedna uwaga na temat reprezentacji: Wiesz, że każda taka lista ma dokładnie 2 elementy. W takich przypadkach lepiej jest używać określeń takich jak 'x = 0',' x = 1' do reprezentowania powiązań bardziej zwięźle: '[x, 0]' jest '. (X,.(0, []) ', marnując miejsce na dodatkowy funktor'./2' i jeden atom '[]' dla każdej takiej struktury. Natomiast "x = 0" to '= (x, 0)", tj. Tylko jeden funktor i jego dwa argumenty. Jak powiedzieli inni, możesz faktycznie delegować wiązanie do Prolog łatwo, używając zamiast tego rzeczywistych zmiennych logicznych. Możesz zapisać korespondencję symbol/zmienna zamiast zmiennej/wartości jeden! – mat