Пролог булево уравнение решить

Я получил эту программу для работы до сих пор в пролог GNU

not(X) :- \+ X.  
and(X, Y):-  X , Y.  
or(X, Y):-   X ; Y. 
implies(X, Y):- \+ X ; Y.  

p.
q.

:- initialization(main).

main :- 
    write('Program start'), nl.

Вы можете ввести и (p, q), и получить да, а также и (p, не (q)) и получить нет. Теперь я хотел бы сделать что-то вроде этого:

Я установил p в true, (инициализируя его с помощью p.) И (и (p, q)) в true (но без инициализации q), и я хочу, чтобы пролог сказал: существует одно решение: "q" должно быть истинным

Если я установил p и (или (p, q)) в true, я хочу, чтобы пролог сказал: существует два решения, "q" может быть истинным или ложным. Какой лучший способ сделать это?

2 ответа

Рассмотрите возможность использования системы Prolog с булевым решателем ограничений. Например, в SICStus и SWI-Prolog:

?- use_module(library(clpb)).
true.

?- P = 1, sat(P * Q).
P = Q, Q = 1.

?- P = 1, sat_count(P + Q, Count).
Count = 2,
P = 1.

?- P = 1, sat(P + Q), labeling([P,Q]).
P = 1,
Q = 0 ;
P = Q, Q = 1.

Вы также можете использовать конечный доменный ограничитель GNU Prolog, поскольку логические значения являются частным случаем целых чисел.

Я предлагаю вам использовать переменные вместо p а также q и обернуть его в некоторый термин, например

and(prop(P),prop(Q))

Кроме того, я бы реализовал два предиката, один для решения истинных утверждений, один для решения ложных утверждений. С помощью \+ это неправильный подход, так как он не позволяет связывать переменные. Вот немного примера кода:

formula_true(prop(true)).
formula_true(and(A,B)) :- formula_true(A),formula_true(B).
formula_true(not(A)) :- formula_false(A).
...

formula_false(prop(false)).
formula_false(and(A,B)) :- formula_false(A);formula_false(B).
...

Ваш пример запроса будет тогда:

P=true,formula_true(and(prop(P),prop(Q))).

И, может быть, у вас есть лучшее имя, чем formula_true соответственно formula_false,:)

Если у вас есть логический решатель ограничений, это, конечно, будет более эффективным.

Другие вопросы по тегам