2016-05-18 6 views
1
my_reverse(L1,L2) :- my_rev2(L1,L2,[]). 

my_rev2([],L2,L2). 
my_rev2([X|Xs],L2,Acc) :- my_rev2(Xs,L2,[X|Acc]). 

こんにちは、Prolog。二つの変数と同じ名前

それは2行目の変数の2つのに同じ名前があることは何を意味するのでしょうか?私は「第二のライン」で想定

答えて

4

あなたは「三行目」を意味、私たちは句について話している:右、my_rev2/3の最初の句です

my_rev2([], L2, L2). 

それで、同じ変数が出現することはどういう意味ですか2回ここでは節の頭に?副問答:最初の議論が文頭で  []であることはどういう意味ですか?

最初に新鮮な変数を導入し、すべての統一をに明示すると、これは明示的になります。。次のように私たちは、句を書くことができます

my_rev2(Ls, L1, L2) :- Ls = [], L1 = L2. 

をそして今、それが明確である:my_rev(Ls, L1, L2)場合Ls = []L1 = L2を保持しています。もちろん、そのように冗長にする必要はありません。そのため、そのような統一を節の頭に直接取り込むことができます!

これはすべての非常に些細に聞こえるかもしれないが、実際には、あなたの質問は非常に良いものです:私は多くの初心者ない、句の頭の中に、このような単一化を引っ張っ不彼らのコードを複雑にすると同時にを見てきました(このことが多いです手を取り合って)また効率が悪くなります。


スタイルの小さなノート:私は定期的に英語複数形と同様に、 「S」と リスト終わりを表す変数の名前を聞かせすることをお勧めします。また、補助述部の名前にアンダースコア ( _)を追加すると便利なことがよくあります。だから、私は最初の事実と同様の を記述します。

reverse_([], As, Bs) :- As = Bs. 
+0

優秀説明:

reverse_([], Ls, Ls). 

と、この、もちろん、意味的に等価です!ありがとう:) –

+0

あなたはここに決着があるところを私にヒントできますか? –

+2

解決策との関連は、例えば* The Art of Prolog *で詳しく説明されています。詳しくは、チェックアウトすることをお勧めします。 – mat

関連する問題