我正在尝试编写一个谓词,它可以将任何整数列表转换为一堆“奇偶校验运行”,其中每个运行是原始列表中连续偶数或奇数的(最大)序列。
例如,列表
列表= [8,0,4,3,7,2,-1,9,9]
可分为[8,0,4],[3,7],[2]和[-1,9,9]
我要做的是递归扫描列表并将整数逐个追加到名为OldList的列表中。程序将保持附加整数,直到附加了相反极性(奇数或偶数)的数字,然后OldList将创建一个名为TinyList的新列表,其中包含1个奇偶校验运行。然后将这个单独的奇偶校验运行附加到结果输出列表上。我遇到的问题是在成功完成1个奇偶校验运行后重置OldList。我正在尝试将OldList转换为空列表,以便我可以继续进行更多奇偶校验运行,但我没有运气。有什么想法吗?
这是我的代码:
% base case
paruns([], [], []).
% recursive case
paruns([Head|Tail], OldList, RunList):-
paruns(Tail, TempList, SubList),
% appending each integer to the OldList
append([Head], TempList, OldList),.
% returns a parity run when polarity of number changes or returns nothing
createTinyList(OldList, TinyList),
/*
Trying to reset OldList here <-------------------- but no luck :(
*/
% appends 1 parity run list into the final output list
append(TinyList, SubList, RunList).
% checks if number is odd
odd(Num):-
1 is Num mod 2.
% checks if number is even
even(Num):-
0 is Num mod 2.
% checks if the polarity of 1st and 2nd numbers are same
% returns [] if both numbers have same polarity
% if 1st and 2nd numbers have different polarity this predicate will output the whole list, excluding the 1st number with different polarity
createTinyList([Head|[]],[]).
createTinyList([Head|[MiniHead|Tail]], []):-
odd(Head), odd(MiniHead).
createTinyList([Head|[MiniHead|Tail]], []):-
even(Head), even(MiniHead).
createTinyList([Head|[MiniHead|Tail]], [MiniHead|Tail]):-
odd(Head), even(MiniHead).
createTinyList([Head|[MiniHead|Tail]], [MiniHead|Tail]):-
even(Head), odd(MiniHead).
每当我提到极性时,假设我在谈论数字的奇怪或均匀。