2014-09-03 4 views
2

프롤로그 (이 경우 SWI-Prolog)에 완전히 새로 워서 매우 기본적인 질문에 사과드립니다. 아래에 간단한 프로그램이 있습니다. 간단한 프롤로그 프로그램 - 결과에 대해 확실하지 않음

loves(vincent,mia). 
loves(marsellus,mia). 
loves(pumpkin,honey_bunny). 
loves(honey_bunny,pumpkin). 

jealous(X, Y):- loves(X,Z), loves(Y,Z). 

나는 다음과 같은 쿼리의 결과로 약간의 혼란 스러워요 :

?- jealous(vincent, X). 
X = vincent ; 
X = marsellus. 

은 아마도 내가 프롤로그의 통일 과정 단지 익숙하지 해요,하지만해야하지 대답 단지를 marsellus일까요? 왜 빈센트는 유효한 결과로 여기에 포함됩니까?

다음 질문으로 : 나는 질투하는 모든 사람들의 결과를 얻기 위해 질투심 (X, Y)과 같은 질의를 쓸 것이라고 정정했다. ?

그렇다면 누군가가 상기 쿼리의 다음 결과를 설명 할 수 있습니까?

?- jealous(X, Y). 
X = Y, Y = vincent ; 
X = vincent, 
Y = marsellus ; 
X = marsellus, 
Y = vincent ; 
X = Y, Y = marsellus ; 
X = Y, Y = pumpkin ; 
X = Y, Y = honey_bunny. 

모든 도움을 주시면 감사하겠습니다. 감사!

답변

4

첫 번째 질문에 대해서는 출력 결과가 어떻게되는지를 알 수 있습니다.

당신은 빈센트가 사랑하는 사람을 사랑하는 사람들의 목록을 요청하고 있습니다.

Vincent와 Marsellus 모두 Mia를 좋아하기 때문에 목록은 {Vincent, Marsellus}입니다.

나는 프롤로그의 구문의 확실하지 않다하지만 당신은 싶어 뭔가 같은 :

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

는 "프롤로그 의미에서 어떤 기호를 사용하여, X와 Y가 같은 사람을 참조하는 경우를 제거하는 같지 않은 경우 "와 같지 않습니다. \==. 당신이 경우, 분할 인격 장애의 일종으로 고통과하지 않는 한

그것은 자신질투 조금 어렵습니다, 당신은 하지 자신이 실제로, self의 질투입니다 주장 할 수 이러한 상황에서 다소 유동적 인 개념이되었습니다.


두 번째 질문 출력은 약간의 생각 후에도 의미가 있으며 위에서 설명한 것과 동일한 문제와 관련이 있습니다. 약간 포맷 출력에서 ​​상대 :

X = Y,   Y = vincent ; 
X = vincent, Y = marsellus ; 
X = marsellus, Y = vincent ; 
X = Y,   Y = marsellus ; 
X = Y,   Y = pumpkin ; 
X = Y,   Y = honey_bunny. 

이 정확히 그 의미 X = Y와 질투으로 출력한다가,있다, XYY는 각 라인의 두 번째 항목으로 지정되면서, 동일합니다. 첫 번째 질문과 유사 즉,

X = vincent,  Y = vincent ; 
X = vincent,  Y = marsellus ; 
X = marsellus, Y = vincent ; 
X = marsellus, Y = marsellus ; 
X = pumpkin,  Y = pumpkin ; 
X = honey_bunny, Y = honey_bunny. 

, 모든 사람들이 그들 자신,뿐만 아니라 주어진 대상을 사랑 수있는 다른 사람들 의 질투로 : 그것은 다시 작성할 수 있습니다.

질투 감지기를 제안대로 수정하면 그 모든 자기 혐오감이 사라질 수 있으며 세계는 더 행복한 장소가 될 것이라고 생각합니다.

글쎄, 분명히 여전히 서로를 싫어하고 누가 짝사랑을 앓고있는 빈센트와 마르셀러스 외에. 세상은 때때로 가혹한 장소 일 수 있습니다 :-)

+0

감사합니다. 너는 옳은 것처럼 보인다. 나는 X와 Y가 같을 수 없다는 것을 명시해야한다고 생각한다. 나는 이것이 내가 쓴 규칙에 의해 추측 될 것이라고 생각했지만, 나는 그렇지 않다고 생각한다! – Decoy

+0

또한 SWI-Prolog에 쓰는 올바른 방법은 X \ == Y 일 것입니다 (다른 사람의 답에 자유롭게 편집하십시오). – Decoy

+0

@Decoy, 그 덕분에, 나는 그것을 추가했습니다. 나는 또한 두 번째 질문을 열거했다고 생각합니다. 그것은 같은 문제로 인한 것입니다. 업데이트 된 답변을 참조하십시오. – paxdiablo

관련 문제