2016-11-26 6 views
1

DCG에서 다음과 같은 전이 함수를 사용할 수 있습니까? 아니면 DCG 규칙과 결합할까요?DCG의 전이 함수

genx(A,B) :- gen(A,B). 
genx(A,C) :- gen(A,B), genx(B,C). 
gen(a,b). 
gen(b,c). 

내가 정확히 할 노력하고있어 설명 할 것입니다 :

을 난이 문법이있는 경우 :

noun_phrase(D,N) --> det(D), noun(N). 
noun(n(cat)) --> [cat]. 

나는 내가에 noun(N)N를 원하는 경우 같은 몇 가지 제한을 만들고 싶어를 동물이 되십시오. 고양이의 정보가 동물입니다

noun_phrase(np(D,N)) --> det(D), noun(N), genx(N, animal). 

이 같은 몇 가지 사실에서 유추 된입니다 :

gen(cat,pet). 
gen(pet,animal). 

감사

답변

0

알아 보았 것이 확실하지 그래서 나는이 같은 것을 사용할 수 있습니다.

나는 규칙

보기의 공식적인 관점에서, 잘못 아니에요 경우
genx(A,B) :- gen(A,B). 
genx(A,C) :- gen(A,B), genx(B,C). 

는 사실과

genx --> gen. 
genx --> gen, genx. 

과 같은 DCG 구문에 쓸 수

gen(a, b). 
gen(b, c). 

genx(a, c)이 true를 반환합니다.

그러나 DCG에서 A, B, C은 목록으로 표시됩니다.

대수적 규칙을 구현하기 위해 이러한 방식으로 DCG (구문 분석 용)를 사용하는 것이 합리적인지는 알 수 없습니다.

+0

답변 주셔서 감사합니다.하지만 작동하지 않는 것 같습니다. 좀 더 명확한 대답을 줄 수 있습니까? – user2598997

+0

@ user2598997 - 귀하의 프롤로그를 사용하고 있습니까? 나는 gprolog 및 swi-prolog와 함께 작업하는 것을 보았습니다. not list가 문제라면'gen ([a], [b]) .'와'gen ([b], [c])의 사실을 바꿀 수 있습니다. 'genx ([a], [c])'는 참을 리턴해야합니다. – max66

+0

swi-prolog (온라인 vserion)를 사용하고 있습니다. genx (A, B) -> gen (A, B). genx (A, C) -> gen (A, B), genx (B, C). gen ([a], [b]). gen ([b], [c]). 프로 시저'genx (A, B) '가 존재하지 않습니다. – user2598997