2012-03-06 2 views
2

프롤로그를 사용하여 음악 컨텍스트에 대한 간단한 DCG를 개발하려고합니다.DCG 형식 연결

나는 다음과 같은 방법으로 음표를 정의했습니다 :

note(ton) --> [a];[d];[f]. 
note(sup) --> [b];[e];[g]. 
etc. 

't'와 'SUP'인수가 위에있는 노트를 화음과 관련이은에 속한다. 노트 a, d 및 f는 * * ic 코드에 속하며 노트 b, e 및 g는 * sup *에 트로닉 코드 (D 메이저 키의 키)에 속합니다.

이제는 두 개의 인수 (코드와 음표 기간 중 하나)를 취하는 추가 '메모'기호를 소개하고자합니다. 예를 들어,

note(X,q) --> note(X),[2]. 

내 문제는 note (X), [2]가 목록 [a, 2]이라는 사실에 있습니다. [a2] 형식으로 필요합니다. 일곱 개 가지 코드 내 표현의 일곱 개 가지 음표 길이가 있기 때문에

note(ton) --> [a];[d];[f]. 
note(ton,q) --> [a2];[d2];[f2]. 

그러나,이 불필요한 많이 포함 것 (:

이 변수 X를 사용하지 않음으로써이 문제를 해결 얻을 수 있습니다 나는 생각한다) 코드.

note (X)와 정수 2를 연결하는 방법을 잘 모르겠습니다. 또한이 작업을 수행해야하는 위치가 확실하지 않습니다. 다시 쓰기 규칙의 오른쪽에있는 것들을 연결할 수 있습니까?

감사합니다,

답변

0

SWI - 프롤로그 atomic_list_concat/2있다. 원래 코드를 실행 한 다음이 술어를 통해 결과 아톰 목록을 실행하여 단일 아톰을 출력으로 얻을 수 있습니다.

?- X=ton, phrase(note(X, q), ListOut), atomic_list_concat(ListOut, Atom). 
Atom = a2 ; 
Atom = d2 ; 
Atom = f2. 
+0

감사합니다. 이게 내가 원하는거야. 그러나 현재로서는 문법을로드하고? - 프롬프트에서 제안 된 코드를 실행하여 올바른 응답 만 얻을 수 있습니다. 문법 내에서 동일한 것을 구현할 수있어서 메모를 a 또는 a2로 나타낼 수 있습니다. 죄송합니다. 불분명하다면. –

+0

그래서 메모를 호출하는 새로운 문법 작품을 원하십니까? note (X, q) -> {구문 (note (X), ListOut), atomic_list_concat (ListOut, Atom)}, [Atom] – DaveEdelstein

+0

또는 문법 규칙 note_q (X) -> {phrase (note (X), ListOut), atomic_list_concat (ListOut, Atom)}, [Atom]을 새로 작성하십시오. 미안해, 네가 할 수있는 일, 내가 할 수있는 일을 설명하지 못한다면. – DaveEdelstein