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つのに同じ名前があることは何を意味するのでしょうか?私は「第二のライン」で想定
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つのに同じ名前があることは何を意味するのでしょうか?私は「第二のライン」で想定
あなたは「三行目」を意味、私たちは句について話している:右、my_rev2/3
の最初の句です
my_rev2([], L2, L2).
?
それで、同じ変数が出現することはどういう意味ですか2回ここでは節の頭に?副問答:最初の議論が文頭で []
であることはどういう意味ですか?
最初に新鮮な変数を導入し、すべての統一をに明示すると、これは明示的になります。。次のように私たちは、句を書くことができます
my_rev2(Ls, L1, L2) :- Ls = [], L1 = L2.
をそして今、それが明確である:my_rev(Ls, L1, L2)
は場合Ls = []
とL1 = L2
を保持しています。もちろん、そのように冗長にする必要はありません。そのため、そのような統一を節の頭に直接取り込むことができます!
これはすべての非常に些細に聞こえるかもしれないが、実際には、あなたの質問は非常に良いものです:私は多くの初心者ない、句の頭の中に、このような単一化を引っ張っ不彼らのコードを複雑にすると同時にを見てきました(このことが多いです手を取り合って)また効率が悪くなります。
_
)を追加すると便利なことがよくあります。だから、私は最初の事実と同様の を記述します。
reverse_([], As, Bs) :- As = Bs.
優秀説明:
と、この、もちろん、意味的に等価です!ありがとう:) –
あなたはここに決着があるところを私にヒントできますか? –
解決策との関連は、例えば* The Art of Prolog *で詳しく説明されています。詳しくは、チェックアウトすることをお勧めします。 – mat