2013-09-24 2 views
1

"스택"이라는 목록 구조가 있습니다. 왜 나는 성냥을 얻지 못합니까?

stack([[s]],[np,[noun,john]]) 

내가 추적을 실행이있어, 그 어떤 스택이 유지 될 것으로 예상되는 : 문제를 일으키는 내 프로그램의 시점에서

,이 스택 보유 것입니다.

이 규칙과 일치해야하는 다음 규칙을 작성할 때.

if 
    buffer([[Word|_]]) 
    and aux(Word) 
    and stack([s],[np,[noun, john]]) 

이렇게하면 규칙이 다음과 같이 실행됩니다. 하지만 여기서 "and stack ([[s]], [np, [noun, john]])"대신에 변수를 사용해야합니다. 그러나 다른 것을 사용하려고하면 규칙이 실행되지 않습니다. 나는 이유를 해결할 수 없다. 목록에서 변수를 사용할 때 다른 규칙이 제대로 작동합니다.

은 필자 내가이 문제를 원인을 완전히 확실하지 않다

stack([s]|Foo) 
stack([s]|[Foo]) 
stack([MyHead]|[MyTail]... and literally every other combination I can think of. 

을 시도

답변

3

귀하의 스택은 각 인수는 목록입니다 arity에 2를 갖고있는 것 같아요.()/2 (즉, 분리), 당신이 어떤 구문을 볼 수 없습니다 (|)에 대한 대안으로/2 운영자

이 나열

stack([s]|Foo) 
stack([s]|[Foo]) 
... 

하지만 일부 프롤로그는 선언 이후

에 대한 올바른 구문되지 않습니다 오류.

하는 당신에게 문제를 이해하기 위해서는, 당신은 당신이

S = [[s]] 
Foo = [np,[noun,john]] 
+0

감사합니다 얻을 것이다 통일 연산자 (=)/2

?- stack(S, Foo) = stack([[s]],[np,[noun,john]]). 

의 평균에 의해, 통일을 시도 할 수 있습니다; 나는 당신의 제안을 시도했지만이 오류가 발생합니다 "구문 오류 : 연산자 우선 순위 충돌"어떤 아이디어? – yoonsi

+1

나는 SWI-Prolog와 Gnu Prolog를 모두 시험해 보았다. 둘 다 예상대로 일했다. 어떤 시스템을 사용하고 있으며, 프롬프트가 끝나면 정확히 무엇을 썼습니까? – CapelliC

관련 문제