3

Prolog を使用して、ビットのすべてのリストをリストする 2 つの式を取得しました。

bit(0).
bit(1).

bitlist1([]).
bitlist1([B|Bs]) :-
    bit(B),
    bitlist1(Bs).

bitlist2([]).
bitlist2([B|Bs]) :-
    bitlist2(Bs),
    bit(B).

それらが論理的に同等であるかどうか、そして両方が実際にすべてのビットリストをリストしている場合でも、私にはよくわかりません。

SWI-Prolog を使用しているため、次の出力が得られました。

?- bitlist1(Bs).
Bs = [] ;
Bs = [0] ;
Bs = [0, 0] ;
Bs = [0, 0, 0] ;
Bs = [0, 0, 0, 0] ;
Bs = [0, 0, 0, 0, 0] ;
Bs = [0, 0, 0, 0, 0, 0] ;
Bs = [0, 0, 0, 0, 0, 0, 0] ;
Bs = [0, 0, 0, 0, 0, 0, 0, 0] ;
Bs = [0, 0, 0, 0, 0, 0, 0, 0, 0] ;
Bs = [0, 0, 0, 0, 0, 0, 0, 0, 0|...] ;
...

?- bitlist2(Bs).
Bs = [] ;
Bs = [0] ;
Bs = [1] ;
Bs = [0, 0] ;
Bs = [1, 0] ;
Bs = [0, 1] ;
Bs = [1, 1] ;
Bs = [0, 0, 0] ;
Bs = [1, 0, 0] ;
Bs = [0, 1, 0] ;
Bs = [1, 1, 0] ;
Bs = [0, 0, 1] ;
Bs = [1, 0, 1] ;
Bs = [0, 1, 1] ;
Bs = [1, 1, 1] ;
Bs = [0, 0, 0, 0] ;
...

bitlist1ゼロのみを含むすべてのビットリストのリストを開始し、その後他のすべてのリストのリストを開始しますが、Prolog がゼロのみを含むビットリストの無限のストリームをリストするため、実際にはこれを確認できません。

bitlist20すべての長さのとのすべての組み合わせをリスト1し、その後、より長い長さのビット リストを続けます。

したがって、それらは論理的に同等であり、ビットリストの出力順序のみが異なります。

誰かが私の推測を確認したり、2 つの式が論理的に等価ではない理由を説明したりできるでしょうか? 素晴らしいことだ。

4

4 に答える 4