2013-03-16 5 views
2

편집 : 나는 싱글 톤 변수를 알아 냈습니다. 프롤로그는 데이터 뱅크에 대해 캡 티알 라이즈 된 단어를 좋아하지 않습니다. 나는 또한 그 코드에 엄청난 변화를 주었다.프롤로그 기능 (예 : 자동차 소유권 기록)

편집 : : 실현 재귀 호출이 없습니다. Derp

나는 하스켈과 함수 프로그래밍에 대한 경험이 있지만 프롤로그에 상당히 익숙하다.

나는 진술을 사실로 만드는 모든 가능한 값을 출력하는 데 문제가있다. 나는 그것이 지난 몇 시간 동안 그것을 걷고 있었으므로 그것이 논리 오류라고 생각하지 않는다. 그러나 나는 틀릴 수있다.

이 문제는 자동차 소유권 기록을 만들려고 시도하고 있습니다.

- 나는 사람이 자동차를 소유하고 있다는 것을 알고 있습니다. - Hee/그녀가 딜러로부터 자동차를 구입했습니다. - 그녀는 이전 자동차 소유자에게서 구입했습니다.

그래서이 사실을 알고 저는 자동차, 소유자 및이 재귀의 기본 케이스로 작동 할 별도의 딜러 변수를 만드는 데이터 뱅크를 설정했습니다.

car(prius). 
car(bmw). 

owner(meg). 
owner(nora). 
dealer(d). 

boughtFrom(meg,nora). 
boughtFrom(nora,d). 

나는 대리점에서 구입 한 nora에서 구입 한 meg를 설립했습니다. 당신이 딜러로부터 구입할 때 재귀를 계획하고 있습니다. 왜냐하면 이것이 기본 케이스의 끝점이기 때문입니다. 당신이 상인 경우

ownCar(X,Y) :- boughtFrom(X,d), car(Y). 
ownCar(X,Y) :- ownCar(boughtFrom(_,prevowner(X)), car(Y)). 

당신은 자동차의 소유자가 될 수 또는 이전 소유자로부터 차를 구입하는 경우 : 그래서 논리는 다음과 같이 간다. 딜러 또는 다른 이전 소유자로부터 이전 주인을 구입 한 경우 이전 소유자는 소유자입니다. 그래서 멈추는 유일한 시간은 그 사람이 딜러로부터 자동차를 구입했을 때입니다.

답변

0

일부 명백한 관계가 없기 때문에 데이터베이스가 불완전하다고 생각합니다.

모두 예를 들어,이 규칙은 ownCar(X,Y) :- boughtFrom(X,d), car(Y).입니다. 즉, 딜러로부터 구입 한 사람은 각 자동차를 소유하게됩니다.

표현이 정확하지 않습니다. 판매자가 차를 판매 한 후에 판매자가 더 이상 소유자가되어서는 안됩니다. , 프롤로그에서 우리는 왼쪽 재귀를 피해야

ownCar(X, Y) :- owner(O), boughtFrom(X, O), ownCar(O, Y). 

참고 그것 때문에 :

어쨌든, 프롤로그에서 당신은 이 (가 관계형 데이터 모델이다), 다음 이적 재산의 폐쇄를 얻을 조인 쓰기 무한 루프로 이어질 수 있다면 조인 순서가 중요합니다.

편집 당신은 목록으로 당신의 조건, 또는 변경 '출력'에 인수를 추가해야합니다 (목록으로) 역사를 얻을 수 있습니다.당신은

ownCar(X, Y, [X]) :- boughtFrom(X,d), car(Y). 
ownCar(X, Y, [X|L]) :- owner(O), boughtFrom(X, O), ownCar(O, Y, L). 

주처럼 뭔가를 할 수 : 종래 프롤로그에서 우리는 마지막 인자 위치에서 '출력'인수를 배치합니다.

+0

답장을 보내 주셔서 감사합니다. 좋아요. 재귀 적 문제를 더 잘 이해합니다. 하지만이 기능으로 달성하려는 것은 이전 소유자의 이름을 표시하는 것입니다. 그럼'? - ownCar (X, Prius) '를 입력하면은'X = meg.'를 출력합니다. 'X = nora.' 그리고 현재 그녀가 현재 소유자이기 때문에 나는 단지 메구 만 얻습니다. 정말 함수 이름을 carOwnerHist로 변경해야한다고 생각합니다. – Mark