如何编写具有相同数量元素的序言程序
How to code a prolog program that has same amount of elements
我想在 prolog 中编写代码,如果列表中的 a 和 b 的数量完全相同或者列表为空,那么 returns 为真。例如:{} 为真,{aaababbb} 为真,{abba} 也为真。但是{aabbb}是假的,{a}是假的,{b}是假的。
这是我尝试做的事情:
语言([]).
语言(L) :-
语言(L,[])。
语言([a, b | A], A).
语言([a|A], B) :-
语言(A,C),
C = [b|B].
这是对我的 的微不足道的修改,其中 Bal 变量保留 as 的数量和b一样。
ab_list2(ABs) :-
length(ABs, Len),
ab_list2_(Len, 0, [], ABs).
% 0 characters left to add
% 0 is the balance of as and bs, i.e. same amount of each
ab_list2_(0, 0, ABs, ABs).
ab_list2_(CharsToAdd, Bal, SoFar, ABs) :-
succ(CharsToAdd0, CharsToAdd),
add_char(Char, Inc),
Bal1 is Bal + Inc,
% Ensure that the balance can be zero for the complete list
CharsToAdd0 >= abs(Bal1),
ab_list2_(CharsToAdd0, Bal1, [Char|SoFar], ABs).
add_char(b, -1).
add_char(a, 1).
swi-prolog 中的结果:
?- time(findnsols(10, L, ab_list2(L), Ls)).
% 387 inferences, 0.000 CPU in 0.000 seconds (100% CPU, 1297961 Lips)
Ls = [[], [a, b], [b, a], [a, a, b, b], [a, b, a, b], [b, a, a, b], [a, b, b, a], [b, a, b, a], [b, b, a, a], [a, a, a, b, b, b]]
我想在 prolog 中编写代码,如果列表中的 a 和 b 的数量完全相同或者列表为空,那么 returns 为真。例如:{} 为真,{aaababbb} 为真,{abba} 也为真。但是{aabbb}是假的,{a}是假的,{b}是假的。
这是我尝试做的事情:
语言([]).
语言(L) :- 语言(L,[])。
语言([a, b | A], A).
语言([a|A], B) :- 语言(A,C), C = [b|B].
这是对我的
ab_list2(ABs) :-
length(ABs, Len),
ab_list2_(Len, 0, [], ABs).
% 0 characters left to add
% 0 is the balance of as and bs, i.e. same amount of each
ab_list2_(0, 0, ABs, ABs).
ab_list2_(CharsToAdd, Bal, SoFar, ABs) :-
succ(CharsToAdd0, CharsToAdd),
add_char(Char, Inc),
Bal1 is Bal + Inc,
% Ensure that the balance can be zero for the complete list
CharsToAdd0 >= abs(Bal1),
ab_list2_(CharsToAdd0, Bal1, [Char|SoFar], ABs).
add_char(b, -1).
add_char(a, 1).
swi-prolog 中的结果:
?- time(findnsols(10, L, ab_list2(L), Ls)).
% 387 inferences, 0.000 CPU in 0.000 seconds (100% CPU, 1297961 Lips)
Ls = [[], [a, b], [b, a], [a, a, b, b], [a, b, a, b], [b, a, a, b], [a, b, b, a], [b, a, b, a], [b, b, a, a], [a, a, a, b, b, b]]