2017-09-11 8 views
0

私はプロローグの新しいプログラマと私は言いプログラムを実行しようとしました:最初の要素:述語XがリストであるとXにどこ5つの連続する要素がある場合trueを返すpenta(X)を作ります1番目と2番目の間の合計です。また、3番目の要素は、5番目と4番目の違いです。たとえば、X = [ ... 5, 7, 12, 18, 30, ... ]です。のPrologプログラムが

だから私はこれをしなかった:

penta(X) :- 
\+length(X,0), //here i verify if the lists contains less than 5 elements so it gives false. 
\+length(X,1), 
\+length(X,2), 
\+length(X,3), 
\+length(X,4), 
(A, B, C, D, E | X), 
C is A + B, 
C is D - E, 
penta(X). 

それはまだ動作しませんので、これは実際にはコンパイルされません。あなたが望むなら、何が間違っているか教えてください。

ありがとうございます。

+0

「コンパイルしていない」というエラーメッセージが表示されることがあります。それを読んでみてください。 –

+0

@ScottHunterそれは言う:uncoughtエラー(プロシージャ、( '|')/ 2)、ペンタ/ 1 – MArivs

+0

@ScottHunterああ申し訳ありません!今コンパイルされますが、私は前にこの文章を書いています – MArivs

答えて

3

プロローグでは、述語ではなく、関数と記載しています。述語は、インスタンス化された変数のセットを成功または失敗させるルールを定義します。したがって、Xが条件を満たす5つの連続する要素を含むリストである場合は、述語penta(X)が成功します。

先頭から始めてください。基準を満たす5つの連続した要素がリストの先頭にあるか、後のリストに含まれます。

% Succeed if the first 5 elements meets the criteria 
penta([A, B, C, D, E |_]) :- 
    ... % what goes here for this to succeed? 

% Succeeds if the rest of the list succeeds, without the first element 
penta([_|T]) :- penta(T). 

私はこれらがあなたが必要とする唯一の2つのルールだと思います。これらのクエリと一致しないクエリは、デフォルトでは失敗します。これは必要なものです。 0から4までの長さの場合の長さを確認する必要はありません。これらのケースでは、上記の述語は失敗します。

上記を実装する方法によっては、何回か成功する可能性があることに気づくでしょう。つまり、複数の解決策を見つけることができます。それがあなたが望むものなのか、それとも1つの解決策の後にそれを止めたいのかを決める必要があります。それ以上の運動として私は残しておきます。