2012-11-15 7 views
6

나는 프롤로그에서 부정에 대한 명확한 답을 찾고 힘든 시간을 했어, 그래서 나는 사과 "X와 Y는 X가 Y와 Y 만 좋아한다면 서로 사랑합니다"SWI - 프롤로그 부정

likes(mary,john). 
likes(mary,chad). 
likes(john,mary). 

loves(X,Y):- likes(X,Y), \+likes(X,Z). 

그때 내 프로그램을 실행하고 간단하게 질문 : 내 .pl로 코드는 다음과 같이 보입니다

?- loves(X,Y). 

를하지만 항상 밖으로 거짓 온다. 내 논리에 따르면, 그것은 'X = 존, Y = 메리'라고 돌아와야합니다.

나는 "사랑"을 정의하기 위해 여러 줄을 사용하여 상쇄와 음수를 분리하는 몇 가지 조합을 시도했습니다 ... 아마도 부정의 주요 원칙이 누락되었거나 무엇을 구현할 수있는 더 쉬운 방법이 있을지 모릅니다. 나는 여기서하려고 노력하고있어. 도움이 될지 알려주세요.

데비안 소프트웨어 관리자의 SWI-Prolog (swipl)를 사용하고 있습니다. 도움이된다면이 점이 많이 달라질 것입니다.

답변

5

당신의 문제는 규칙이 \+likes(X,Z)을 부를 때이 바인딩되어 있지 않다가 적어도 적어도 사랑이 무효화되는 Z = Y가 될 것입니다. 내 말은, 좋아하는 (X, Y)가 사실이기 때문에, 반드시 진정한 좋아하는 사람 (X, Z)이 될 것입니다.

변경이이 방법 :

loves(X,Y):- likes(X,Y), \+ ((likes(X,Z), Z \= Y)). 

당신은

?- loves(X,Y). 
X = john, 
Y = mary. 
를 얻을 수 있습니다