我有两个表达式来使用 Prolog 列出所有位列表:
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 列出了仅包含零的位列表的无尽流。
bitlist2
0
列出每个长度的和的所有组合,1
然后继续使用长度更高的位列表。
因此它们在 imo 逻辑上是等效的,只是位列表的输出顺序不同。
也许任何人都可以证实我的猜测或解释为什么这两个表达式在逻辑上不等价?会很好。