나는 하나가 가능한 경우 이러한 문제 유형에 대한 dcg 사용해야 @mat에 동의합니다.
다음은 다른 규칙 집합입니다.
abs --> [a].
abs --> [a,b].
abs --> [a,b], abs.
?- phrase(abs, Ls).
Ls = [a] ;
Ls = [a, b] ;
Ls = [a, b, a] ;
Ls = [a, b, a, b] ;
Ls = [a, b, a, b, a] ;
Ls = [a, b, a, b, a, b] ;
Ls = [a, b, a, b, a, b, a] ;
Ls = [a, b, a, b, a, b, a, b] ;
Ls = [a, b, a, b, a, b, a, b, a]
는 흥미롭게도 그 규칙은, DCG를 사용하지 않으려면
Using Definite Clause Grammars in SWI-Prolog
에서 운동 중 하나입니다
abs2 --> [].
abs2 --> [a].
abs2 --> [a,b], abs2.
?- phrase(abs2, Ls).
Ls = [] ;
Ls = [a] ;
Ls = [a, b] ;
Ls = [a, b, a] ;
Ls = [a, b, a, b] ;
Ls = [a, b, a, b, a] ;
Ls = [a, b, a, b, a, b] ;
Ls = [a, b, a, b, a, b, a] ;
Ls = [a, b, a, b, a, b, a, b]
그때 내가 @mat 동의 및 제안이 변화에서 시작 표준 Prolog 구문에서 DCG를 보려면 listing/1
을 사용합니다.
listing(abs).
abs([a|A], A).
abs([a, b|A], A).
abs([a, b|A], B) :-
abs(A, B).
listing(abs2).
abs2(A, A).
abs2([a|A], A).
abs2([a, b|A], B) :-
abs2(A, B).
정상 프롤로그 규칙으로 그들과 같은 사용할 수 있습니다
abs(X,[]).
X = [a] ;
X = [a, b] ;
X = [a, b, a] ;
X = [a, b, a, b] ;
X = [a, b, a, b, a] ;
X = [a, b, a, b, a, b] ;
X = [a, b, a, b, a, b, a]
abs2(X,[]).
X = [] ;
X = [a] ;
X = [a, b] ;
X = [a, b, a] ;
X = [a, b, a, b] ;
X = [a, b, a, b, a] ;
X = [a, b, a, b, a, b]
감사합니다. 흥미 롭다. 전에 우연히 발견되지 않았고 우리 대학의 과정에서 배워야하는 것은 아닙니다. 귀중한 정보입니다! 어쨌든 나는 재귀를 죽이고 스크립트를 만드는 법을 배우고 있으며 DCG가 내 시험에서 받아 들여지는지 확신 할 수 없기 때문에 여전히 전통적인 방법으로 해결책을 찾고 있습니다 :) –
"전통적인 방법으로" 당신은 "덜 읽을 수있는 방법으로"를 의미합니다. 단순히 다음 쿼리를 사용하여 DCG에 상응하는 일반 Prolog 코드를 얻습니다 :'? - listing (abs // 0), listing (abs_rest // 0) .' , 당신의 강사에게 그것을 건네고, 당신이 아마 사용하지 못하는 더 나은 해결책이 있다는 것을 알아야합니다. 왜냐하면 똑같은 것을 표현하는 더 복잡한 방법이있을 때 왜 피팅 형식주의를 사용해야할까요? – mat
전통이 내가 필요한 것을 설명하는 가장 적합한 단어는 아니 었습니다. 머리글, 꼬리 및 목록의 재귀 속성을 사용하여 작성된 것만 알아 내려고합니다. 이러한 방식으로 : ab ([a]). ab ([b, a | T]) : - ab ([a | T]). ab ([a, b | T]) : - ab ([b | T]). –