2015-01-28 3 views
2

그래서 나는 지금까지 해왔 던 운동에 매달렸다.데이터베이스를 쿼리 할 때의 성공과 실패

sd(appleseed0, appleseed1). 

sd(appleseed0, apple1). 
sd(appleseed1, apple1). 
sd(appleseed2, apple1). 

sd(appleseed0, apple2). 
sd(appleseed1, apple2). 
sd(appleseed2, apple2). 

이것이 의미하는 것은 appleseed1이 appleseed0에서 온 것입니다, apple1 난 데 문제는 값이 전환되는 경우 내가 거짓 인쇄하는 데 필요하다 appleseed0 등에서 온 : 나는 다음과 같은 사실을 약. 의미, 내가 쿼리가 지금

seed(apple1, appleseed0).처럼 반대 순서에있을 때 쿼리가 다음 "거짓"seed(appleseed0, apple1)입니다 때 쿼리가 "true"를 초래 할, 내 조건은 다음과 같습니다

seed(A,B) :- sd(A,B) ; sd(B,A). 

나는이 내 쿼리에 상관없이 순서 사실 반환하는 이유는,하지만 내 유일한 생각은 이해 :

seed(A,B) :- sd(A,B). 

하지만 그 어떤 거짓과 그것을 무한 루프를 만들 것 때문에 나는 그런 식으로 쓸 수 없습니다 . seed(appleseed2, apple2)과 같이 표시 될 때 검색어가 "true"가되고 seed(apple2, appleseed2)과 같이 표시 될 때 "false"가 표시되도록하려면 어떻게해야합니까?

+0

"apple1이 appleeseed0에서 온"경우 apple1이 apple1에서 나온 이유는 무엇입니까? sd/2가 지금 의미하는 바는 결코 분명하지 않습니다. – false

답변

1

내가 제대로 질문을 읽고있다 것을 희망 :

당신은 여분의 술어가 필요하지 않습니다. 실제로 당신이 찾고있는 것은 쿼리입니다 :

?- sd(A, B). 

설명과 마찬가지로 성공하거나 실패 할 것입니다. ". sd(A, B)에 해당하는 경우 seed(A, B)이 참 sd(B, A)에 해당하는 경우 또한 사실이다"(당신이 발견 한 것처럼) : 술어

seed(A, B) :- 
    ( sd(A, B) 
    ; sd(B, A) 
    ). 

은 (단지 당신처럼, 단지 쉽게 따라 할 포맷) 읽습니다.

sd(foo, bar). 
sd(bar, foo). 

그런 다음 쿼리 : (!) 흥미로운 부작용은 당신이 당신의 데이터베이스에이 두 가지 사실이 있다면 것입니다

?- seed(foo, bar). 

두 번을 성공, 단지 쿼리처럼

?- seed(bar, foo). 

또는 이에 상응하는 최상위 쿼리

?- sd(bar, foo) ; sd(foo, bar). 

마지막 쿼리를 사용하면 쿼리가 두 번 성공할 수 있습니다.

무엇 나를 혼란 : 왜 당신은

seed(A, B) :- 
    sd(A, B). 

무한 루프로 이어질 것이라고 생각하십니까? 당신이 보여주지 않는 프로그램의 일부가 있습니까? 그 것처럼 술어를 정의하는 것은 sd/2에 별명 인 seed/2을 부여하는 것과 같습니다. 이 정의는 sd(A, B)이 참일 때 "seed(A, B)이 참입니다."

+0

아,이 말이 맞습니다. 나는 (1) 종자 (A, B)와 자신을 혼동했다 : - 종자 (A, B)와 나는 종자 (A, B)를 고려하지 않았다 : - sd (A, B). 나는 (1)이 아무 것도 거짓이 아닌 "무한 루프"를 만들어 낼 것이고, (2)는 (1)이하는 것과 같은 일을하는 것처럼 보이기 때문에 같은 것을 할 것이라고 생각했다. 논리적으로 말해서, (2) 의미가 있습니다. 당신의 explantation은 내 혼란을 정리. 고맙습니다! 나는 이것이 나의 학습에 귀중한 그래서 Prolog에 새롭다! –