2017-03-07 11 views
2

Prolog述語をDCGコードに変換しようとしています。私が文法の熟語に慣れていても、DCGがどのようにリストと一緒に働くのか、どのように使用するのかを理解するのにはいくつかの問題があります。Prologでリストを使用するDCG

cleanList([], []). 
cleanList([H|L], [H|LL]) :- 
    number(H), 
    cleanList(L, LL), 
    !. 
cleanList([_|L], LL) :- 
    cleanList(L, LL). 

それは、数値以外の要素を削除し、単純な述語です:

実は、これは私の述語です。 DCGに同じ動作を書きたいと思います。

私は(明らかに動作しません)のようなものを試してみました:

cleanList([]) --> []. 
cleanList([H]) --> {number(H)}. 
cleanList([H|T]) --> [H|T], {number(H)}, cleanList(T). 

はそれが間違っているものを私に説明したり、欠けているものは可能ですか?

ありがとうございました!

+0

1つの大きな問題lemは '... - > [H | T]、...'です。 DCGにシーケンスを読み込ませ、 '[H | T]'は任意の長さにします。あなたはなぜその言葉に 'T'を含めたのか分かりません。 'cleanList(T)'へのあなたの再帰呼び出しは、すでに入力上で 'T'をスキャンします。 – lurker

+0

ええ、私はそれを得る!返信ありがとう、私はDCGがどのように再帰的にシーケンスを読んでいるのか理解できませんでしたが、今は問題ありません。 – Naeoth

答えて

1

DCG表記の目的は、正確にはです。以上、暗黙のうちにトークンリストを非表示にしてください。

cleanList([]) --> []. 
cleanList([H|T]) --> [H], {number(H)}, !, cleanList(T). 
cleanList(L) --> [_], cleanList(L). 

スタイルノート::だから、あなたのコードがより効率的にすることができる

cleanList([]) --> []. 
cleanList([H|T]) --> [H], {number(H)}, cleanList(T). 
cleanList(L) --> [H], {\+number(H)}, cleanList(L). 

のようになりますProloggersがやっていることは、ラクダ:)また

clean_list([]) --> []. 
etc... 

を避けるために好むIよりコンパクトなコードを好むでしょう:

clean_list([]) --> []. 
clean_list(R) --> [H], {number(H) -> R = [H|T] ; R = T}, clean_list(T). 
+0

私は答えが近かったことを知っていました、あなたの精神とあなたのアドバイスに感謝します! – Naeoth

関連する問題