2017-03-13 11 views
0

を使用してPrologに述語CleanList/3を書き込む必要があります。これはリストを解析して同じ番号の新しいリストを返しますが、数字は削除されません。例えばDCGを使用してリストから非数字を削除する

?- cleanList([1,2,d,67,3.2,'CSI2120',foo,5],LL). 
LL = [1, 2, 67, 3.2, 5]. 

私はベースケースを書いて、再帰的なケースでDCGを実装するのに苦労。誰かがこれで私を助けることができますか? cleanlist/1への引数が空になったときにそれがないすべては空のリストを返して、非常に単純です

cleanlist([]) --> []. 

:あなたが好きなベースケースを定義することによって開始することができ

cleanList(L,LL) :- cleanList(LL,L,[]),!. 
+2

あなたのベースケースはDCGではなく、基本ケースではありません。ベースケースは再帰的ではありませんが、基本的な最下位レベルの関係を与える必要があります。あなたが持っている再帰呼び出しは、2つしかかからない述語に対して3つの引数を使用します。 – lurker

+1

'number(X)'が 'X 'が数字である場合にのみ成功します。 – lurker

答えて

0

基本ケースリスト。 また、句を定義することができます:それは数で、再帰的にcleanlist/1を呼び出す場合に限っ

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

リストHの頭部を保つています。

例:

?- phrase(cleanlist([1]) ,L). 
L = [1]. 

?- phrase(cleanlist([1,3]) ,L). 
L = [1, 3]. 

?- phrase(cleanlist([1,2,a,c,3]) ,L). 
L = [1, 2, 3]. 

?- phrase(cleanlist([1,2,a,c,3,m,k,l,o,"ABC",12]) ,L). 
L = [1, 2, 3, 12]. 

?- phrase(cleanlist([a,b]) ,L). 
L = []. 

?- phrase(cleanlist([A,1,b]) ,L). 
L = [1]. 
+0

ありがとう! cleanList/2から呼び出されたときにcleanListDCG/3が正しく動作するようにこれを変更する方法はありますか? – user7630822

+0

はい、上記の名前をcleanlistDSGに変更し、新しいルールを追加してください:cleanlist(L、L1): - phrase(cleanlistDCG(L)、L1)これは尋ねられたクリーンリスト/ 2述語です。 – coder

+0

ありがとうございました。 – user7630822

関連する問題