2014-09-12 8 views
2

Я получил эту программу для работы до сих пор в GNU PrologПролог логическое уравнение решить

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. 

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

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

Если я установить р и (или (р, д)), чтобы верно я хочу Prolog сказать: Два решения существует, «д» может быть истинным или ложным. Каков наилучший способ сделать это?

ответ

3

Рассмотрите возможность использования системы 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, так как логические значения представляют собой особый случай целых чисел.

3

Я предлагаю вам использовать переменные вместо 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. :)

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

+1

+1 для использования такого чистого представления! (Что позволяет различать объекты по их функторам). – mat

Смежные вопросы