2017-03-21 7 views
0

私は2つのリスト(AとB)を持っています。私はBの値を使用してAがそれらに従っているかどうかをチェックしたいと思います。Prologで1つのリストから別のリストに値を検証するpredcateを作成する方法は?

Ex1の:

A=[0, 1, 0, 1, 1, 1, 0] 
B=[1, 3] 

この場合はtrueです。私たちはAで1と3を1つ持っているからです。

Ex2の:これらのもので が偽

A=[0, 0, 1, 1, 1] 
A=[1, 1, 1, 0,0,0,1] 

である、それは順序

開始するための任意のアイデアを保持していませんか?

は、問題を解決するために、あなた

+0

あなたはそれらを「検証する」とはどういう意味ですか? 3つの連続したものが続きます。 –

+0

[私はこれがあなたが探していると思う](http://stackoverflow.com/questions/5188084/prolog-how-to-check-if-a-list-includes-certain-elements) – Woops

+0

@WillemVanOnsemはい、それが私の必要なものです。 – Aizzaac

答えて

1

ありがとう、のは、それを分析してみましょう:あなたはABのエンコーディングのいくつかの並べ替えであることを検証します。 Bに数字b0が含まれている場合、aには0とそれに続くb0などが含まれていなければなりません。また、0sがセパレータとして使用されます。

それでは、最初の機能を実装してみましょう:validate_single(Bi,A,AT)ABiのものが含まれており、リストの残りの部分はTAで統一されている場合、単一のBiをチェックします。私たちは、簡単にこのように実装することができます。

validate_single(0,A,A). 
validate_single(N,[1|T],R) :- 
    N > 0, 
    N1 is N-1, 
    validate_single(N1,T,R). 

は、今、私たちは唯一のBのすべての要素のためのvalidate_single作品ということを検証し、1 validate_single上の結果はさらに、さらに渡されるようAにを連鎖を実行する必要があります。セパレータが有効であることを確認する必要もあります。だからここ

validate([0],[]). 
validate([0|A],[Bi|BT]) :- 
    validate_single(Bi,A,AT), 
    validate(AT,BT). 

validate([0|A],[Bi|B]) :- ...Aリストの先頭から0を「ポップ」とし、それが動作するかどうか、単一のサブシーケンスを検証することを目指し、それが尾を継続するだろうが:私たちはでこれを行うことができますサブシーケンスATと末尾にB,BTがあり、最終的にリストの終わりに達するまで、最後には0があります。

または一緒にそれをすべて置く:

validate([0],[]). 
validate([0|A],[Bi|BT]) :- 
    validate_single(Bi,A,AT), 
    validate(AT,BT). 

validate_single(0,A,A). 
validate_single(N,[1|T],R) :- 
    N > 0, 
    N1 is N-1, 
    validate_single(N1,T,R). 
関連する問題