2011-05-26 5 views
2

私はこのプログラムをプロログ言語で書いています。 問題は、どのように動作するのかわかりません。Prolog - このプログラムのしくみ

even_number([],[]). 
even_number([H|T],S):-even_number(T,W),Z is H mod 2,Z==0,S=[H|W]. 
even_number([_|T],S):-even_number(T,S). 

リストから偶数を抽出して別のリストに格納するだけです。 私はそれが再帰を使用して動作することを知っていますが、私は実行中に行われた手順を理解できません。 誰でも説明できますか?

+2

Tedの回答は良いですが、プログラムをファイルに保存し、プロローグインタプリタを起動し、プログラム( '[filename] .')を読み込み、トレースを開始して(' trace.'を使って)、 'even_number'ルールをリストに追加します。それがどのように動作するかを理解しようとすると、その実行を段階的に見ることは非常に役に立ちます。 –

答えて

2

プログラムは、グループとして適用される3つのルールで構成されています。彼らは基本的に一緒にif ... else if ... else if ... [else fail]として動作します。

最初のルールは、空のリストの偶数が空のリストです。これは簡単です。

最初のルールが失敗した場合(つまり、最初の引数が空のリストでない場合)、2番目のルールが適用されます。これはもう少し複雑ですが、基本的にリストの最初の要素が偶数の場合はその要素を含めるように言います。論理は次のように分類されます。 Hで始まり、Tの尾を持って、リスト内の偶数番号の右のすべての条件に該当する場合にSです:Tでも、数字はいくつかのリストWであること。そのZは、Hを2で除算した残りの部分です。そのZはゼロです。 SHであり、その後にはW(いずれにしてもW)となります。

このルールが失敗した場合(つまり、Hが奇数の場合)、最後のルールが適用されます。最後のルールが適用されます。 listは、リストの末尾にある偶数です。

0

これはかなりうまく書かれていません。

even_numbers(X , R) :- 
    even_numbers(X , [] , T) , 
    reverse(T , R). 

even_numbers([] , T , T). 
even_numbers([X|Xs] , T , R) :- 
    Z is X mod 2 , 
    Z == 0 , 
    ! , 
    even_numbers(Xs , [X|T] , R). 
even_numbers([_|Xs] , T , R) :- 
    even_numbers(Xs , T , R). 

最初の述語は、even_numbers/2述語は公共ラッパーです:あなたはそれを少しリファクタリングし、それを末尾再帰を行う場合、理解しやすいかもしれません。それはプライベートヘルパー、even_numbers/3を呼び出し、偶数のリストを逆の順序で返します。それはそれを逆にし、ラッパーに渡された結果と、それを統一しようとします。ソースリストが空の場合

  • : ヘルパーメソッドは、これを行う結果とアキュムレータ(T)を統一します。
  • ソースリストが空でない場合、リスト(X)の頭部がアキュムレータにXを押し、さらに、
    • 再帰ダウンリスト(のX)の尾部にある場合。
  • ソースリストが空でない場合、リスト(X)の頭部がアキュムレータを変更せず
    • 再帰ダウンリスト(のX)の尾部に、奇数の場合。

しかし、@アンドレParamésで述べたように、デバッガでそれを介して動作し、それが何が起こっているのか明らかになるだろう。

関連する問題