2012-04-21 1 views
5

은 Prolog 초보자로서 Prolog에서 교환 적 표현이 매우 직관적이지 않음을 알았습니다.Prolog에서 "Commutativity"를 표현할 수있는 대안은 무엇입니까?

family(X,Y) :- 
     married(X,Y); 
     relative(X,Y); 
     father_son(X,Y). 

나는 또한 "교환 법칙이 성립"하게하기 위해, 정의에 다음을 추가한다 : 나는 X와 Y를 표현하려는 경우 예를 들어

처럼, 한 가족에

 married(Y,X); 
     relative(Y,X); 
     father_son(Y,X). 

그러나 우리는 우아한 코드를 작성하기를 원하기 때문에 우리는 프롤로그를 사용하여 ... 그래서, 나는 원래 (대신 위의 세 가지의) 하나 개의 라인을 추가 할 수 있도록 노력하겠습니다 것 :

 family(Y,X). 

여기에 POINT가 있습니다. 그것은 종말론으로 인도합니다! 왜 프롤로그는 "논리적"이지 않은가? 그리고 끝내지 않는 단서 표현에 대한 대안이 있습니다.

좋은 주말! 와트

답변

7

규칙의 family(X,Y) :- family(Y,X). 부분의 문제는 각 수준에서 무조건 자체 통일 유지하고, 아래로 재귀 유지이다; 이 재귀에서 이탈 조건이 없습니다.

당신은 위의 수준 에서 인수 스왑을해야한다 : 또는

family(X,Y) :- 
    is_family(X,Y); 
    is_family(Y,X). 

is_family(X,Y) :- 
    married(X,Y); 
    relative(X,Y); 
    father_son(X,Y). 

, 당신은 대칭 아래 을 기본 규칙을 만들 수는 의미한다 여기서

is_married(X,Y) :- 
    married(X,Y); 
    married(Y,X). 

is_relative(X,Y) :- 
    relative(X,Y); 
    relative(Y,X). 

이제 수를 다음과 같이 family 규칙을 다시 작성하십시오.

family(X,Y) :- 
    is_married(X,Y); 
    is_relative(X,Y); 
    father_son(X,Y); 
    father_son(Y,X). 
+0

나는 그것을 보았고, 왜 그것이 끝이 없는지도 분명하다. 감사! – Matt

+0

나는 또한 별도의 사실을 사용하는 것이 좋습니다; –

+0

@AlexanderSerebrenik 물론 - 원본 스타일에 가깝고 싶었습니다. 그러나 필자의 Prolog 시절에는 가독성과 디버깅 용이성을 위해'; '보다 여러 규칙을 선호했다. – dasblinkenlight

1

방법에 대해 :

relatives(X,Y) :- 
    married(X,Y); 
    relative(X,Y); 
    father_son(X,Y). 

family(X,Y) :- 
    relatives(X,Y); 
    relatives(Y,X).