计算Prolog中字符后列表中特定元素的出现次数?

时间:2018-03-29 02:07:55

标签: prolog find-occurrences

所以使用这段代码我相信我非常接近,但我认为在计算' w'时,我搞砸了。仅在b' h1([w,w,b,w,b,b],H)'之后的列表中而不是之前。例如,H=1h1([], 0). h1([b|T], Count) :- h1(T, TCount), Count is TCount + 1. 成功。

编辑:我相信我的基本情况是正确的。但是第二部分的递归是错误的。

h1([H|T], Count) :-
    "" \== H,
h1(T, Count).

我觉得我很接近它。附: ""是因为我不确定该放在那里还有什么东西在尝试一些东西。

unpackbits

2 个答案:

答案 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不使用循环而是递归,我建议采用一种非常直观的递归思想:

  • 基本情况:空列表
  • 基本情况:b是列表的头部,然后只计算否。 w列表的其余部分。
  • 递归情况:b不是头部,只需为列表的其余部分调用函数。

我很确定还有其他优雅的方法来解决这个问题。玩得开心。