2013-01-17 1 views
0

프롤로그에서 방금 프로그래밍을 시작했습니다. 나는 몇 가지 조항을 썼다.초보자 : 표현식 오류에서 자유 변수를 추적 할 수 없습니다. 프롤로그 프로그래밍

predicates 
parent(symbol,symbol) 
male(symbol) 
female(symbol) 
mother(symbol,symbol) 
father(symbol,symbol) 
brother(symbol,symbol) 
sister(symbol,symbol) 
uncle(symbol,symbol) 
clauses 
parent(arthur,fred). 
parent(arthur,george). 
parent(arthur,bill). 
parent(arthur,percy). 
parent(arthur,ginny). 
parent(arthur,ron). 
parent(arthur,charlie). 



parent(molly,fred). 
parent(molly,george). 
parent(molly,bill). 
parent(molly,percy). 
parent(molly,ginny). 
parent(molly,ron). 
parent(molly,charlie). 
parent(rowling,arthur). 
parent(rowling,james). 


parent(james,harry). 
parent(lily,harry). 

female(molly). 
female(ginny). 
female(lily). 
female(rowling). 


male(X) if not(female(X)). 


brother(X,Y) if male(Y),X<>Y,brother(Y,X). 
brother(X,Y) if X<>Y,parent(Z,X),parent(Z,Y),male(X). 

mother(X,Y) if parent(X,Y),female(X). 
father(X,Y) if parent(X,Y),male(X). 
sister(X,Y) if parent(Z,X),parent(Z,Y),female(X),X<>Y. 
uncle(X,Y) if parent(Z,Y),brother(X,Z). 

하지만 난 줄 그것은 X <에서 표현의 자유 변수를 보여주고 질문을> Y를

brother(X,james) 

을 요청하려고 할 때 내가 추적 드릴 수 없습니다

brother(X,Y) if male(Y),X<>Y,brother(Y,X). 

코드의 문제점은 무엇입니까

답변

1

m aybe 당신은 규칙

brother(X,Y) if male(Y),X<>Y,parent(Z,X),parent(Z,Y). 

을 단순화하기 위해 시도 할 수 있지만 부정적인 용어로 정의되어 남성 /이 때문에이 작동하지 않을 것입니다. 는 내가 추가 할 작동하게하려면

지금 1/남성 긍정적 인 정보를 생성 할 수있다
person(X) :- parent(X,_) ; parent(_,X). 
male(X) :- person(X), not(female(X)). 

...

(참고 : 테스트되지 않은 코드)

편집 더 나은 방법을, 사람/1을 추가하지 않고도

/* Y is brother of X */ 
brother(X,Y) if parent(Z,X), parent(Z,Y), X<>Y, male(Y). 
+0

X가 Y의 동생이고 Y가 남성이고 Y도 Y의 동생 인 경우 구현할 수 있습니다. 어쨌든, 나는 thi 에스. 문제는 남성의 정의에 있습니다. 그것은 단지 부정적인 용어로 선언됩니다. –