2014-09-12 3 views
2

는 지금까지 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로 (그러나 q를 초기화하지 않고) true로 설정하고, (그리고 (p, q))를 true로 설정하면 원하는 말 프롤로그 : 하나의 솔루션이 존재 : 내가 페이지 설정 (또는 (P, Q)) 내가 프롤로그 원하는 true로 말을하면 "Q"

충족되어야합니다 두 솔루션은, "q"를 존재 할 수 있습니다 진실 또는 거짓. 가장 좋은 방법은 무엇입니까?

답변

3

부울 제한 조건 해결사와 함께 Prolog 시스템을 사용할 것을 고려하십시오. 예를 들어, SICStusSWI-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 프롤로그의 유한 도메인 제약 해결사를 사용할 수 있습니다.

3

pq 대신 변수를 사용하고 몇 가지 용어로 묶는 것이 좋습니다.

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

또한, 저는 두 술어, 해결하는 진정한 문 하나, 거짓 진술을 해결하기위한 하나를 구현하는 것입니다. \+을 사용하면 변수를 바인드 할 수 없으므로 올바른 방법이 아닙니다. 다음 예제 코드의 약간은 다음과 같습니다

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

을 그리고 어쩌면 당신은 formula_true RESP보다 더 좋은 이름이 :

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). 
... 

귀하의 예제 쿼리는 것이다. formula_false. :)

부울 제한 조건 해결사가있는 경우 물론 더 효율적입니다.

+1

+1과 같은 깨끗한 표현! (당신은 펑터에 의해 엔티티를 구분할 수 있습니다). – mat