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

在Prolog中的字符后计算列表中特定元素的出现次数?,prolog,find-occurrences,Prolog,Find Occurrences,因此,我相信我与这段代码非常接近,但我认为我在列表中仅在a'b'之后而不是之前计算'w'时弄错了。例如,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) :-

因此,我相信我与这段代码非常接近,但我认为我在列表中仅在a'
b
'之后而不是之前计算'
w
'时弄错了。例如,
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).

您的语法不是“Prolog”。您可能需要阅读一些基本文档,以了解有关prolog语法的更多信息

因为prolog不使用循环,而是使用递归,我建议使用一种非常直观的递归思维:

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

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

您要做的是逐步检查列表中的每个元素,检查它是否是您的条件字符,然后计算元素并将其返回到您的调用中

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).
我真的可以推荐阅读来学习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).

我想我知道你的意思。我编辑了我原来拥有的东西,并尝试了一些新的东西,但显然失败了。我想我在这个新的编辑中得到了我的基本情况,但我遗漏了一些东西等等,这个基本情况不算在列表开头的“b”之后的每个字母吗。。。哪个对[b,w,b,b]不合适,它会说H=3?嗯,也许我的基本情况是错的第一个基本情况是:一个空的清单是明确的,你得到它的权利。第二个基本情况:“只需计算列表其余部分的w数量”,假设您有一个支持函数,该函数只计算列表中的w数量(比您的问题更简单,但这是一个很好的实践)。我想我知道您的意思。我在另一个程序中使用了一个引用函数,可以计算列表中某个项目出现的次数。我其实是想用它来调整,以适应这个,但正如你们所看到的,并没有按照计划进行哈哈。我会在第二部分上面展示的?谢谢。我去看看。我现在看到了缺失的递归。尤其是检测b部分,我对此感到困惑。