所以使用这段代码我相信我非常接近,但我认为在计算' w
'时,我搞砸了。仅在b
' h1([w,w,b,w,b,b],H)
'之后的列表中而不是之前。例如,H=1
将h1([], 0).
h1([b|T], Count) :-
h1(T, TCount),
Count is TCount + 1.
成功。
h1([H|T], Count) :-
"" \== H,
h1(T, Count).
我觉得我很接近它。附: ""是因为我不确定该放在那里还有什么东西在尝试一些东西。
unpackbits
答案 0 :(得分:1)
您要做的是逐步浏览列表中的每个元素,检查它是否是您的条件字符,然后计算元素并将其返回给您的电话。
forFirstBCountW(List, Count) :- detect_b(List, Count).
detect_b([], _).
detect_b([b|T], Count) :- count_w(T, 0, Count), !.
detect_b([_|T], Count) :- detect_b(T, Count).
count_w([], TotalCount, TotalCount) :- !.
count_w([w|T], CurrentCount, TotalCount) :-
NewCount is CurrentCount + 1,
count_w(T, NewCount, TotalCount).
count_w([_|T], NewCount, TotalCount) :-
count_w(T, NewCount, TotalCount).
我真的可以推荐阅读Learn Prolog Now!来学习Prolog背后的概念,它是一种非常强大的语言。
编辑:为了清晰起见,将谓词分开,以便它们可以单独重复使用,因为detect_b
没有明确命名它的作用。我将离开旧程序,以便您可以比较他们如何得到相同的结果,同时采取不同的路径:
forFirstBCountW(List, Count) :-
detect_b(List, ListFromB),
count_w(ListFromB, 0, Count),
!.
detect_b([], []).
detect_b([b|T], T) :- !.
detect_b([_|T], ReturnList) :- detect_b(T, ReturnList).
count_w([], TotalCount, TotalCount) :- !.
count_w([w|T], CurrentCount, TotalCount) :-
NewCount is CurrentCount + 1,
count_w(T, NewCount, TotalCount).
count_w([_|T], NewCount, TotalCount) :-
count_w(T, NewCount, TotalCount).
这可以进一步抽象,这就是Prolog如此有趣的原因:
forFirstBCountW(List, Count) :-
splitListOnChar(b, List, ListFromB),
count_Char(w, ListFromB, 0, Count),
!.
splitListOnChar(_, [], []).
splitListOnChar(Char, [Char|T], T) :- !.
splitListOnChar(Char, [_|T], ReturnList) :-
splitListOnChar(Char, T, ReturnList).
count_Char(_, [], TotalCount, TotalCount) :- !.
count_Char(Char, [Char|T], CurrentCount, TotalCount) :-
NewCount is CurrentCount + 1,
count_Char(Char, T, NewCount, TotalCount).
count_Char(Char, [_|T], NewCount, TotalCount) :-
count_Char(Char, T, NewCount, TotalCount).
答案 1 :(得分:0)
您的语法不是'Prolog'。您可能需要阅读一些基本文档以了解有关prolog语法的更多信息。
原因prolog不使用循环而是递归,我建议采用一种非常直观的递归思想:
我很确定还有其他优雅的方法来解决这个问题。玩得开心。