Prolog 如何计算一个单词在列表中出现的次数?

Prolog 如何计算一个单词在列表中出现的次数?,prolog,meta-predicate,Prolog,Meta Predicate,如何计算一个单词在列表中出现的次数 例如: counthowmany(你好,[hello,how,are,you,hello,hello],N) N给出出现的单词hello的总数 谢谢这里有一个解决方案: counthowmany(_, [], 0) :- !. counthowmany(X, [X|Q], N) :- !, counthowmany(X, Q, N1), N is N1+1. counthowmany(X, [_|Q], N) :- counthowmany(X, Q, N).

如何计算一个单词在列表中出现的次数

例如:
counthowmany(你好,[hello,how,are,you,hello,hello],N)

N
给出出现的单词
hello
的总数

谢谢

这里有一个解决方案:

counthowmany(_, [], 0) :- !.
counthowmany(X, [X|Q], N) :- !, counthowmany(X, Q, N1), N is N1+1.
counthowmany(X, [_|Q], N) :- counthowmany(X, Q, N).
第一行是终止测试:在空列表上,计数为零。另外两行是递归调用,如果第一个元素匹配(第2行),则计数递增

这是一个类似但纯逻辑的版本(无切割),正如大流士所建议的:

counthowmany(_, [], 0).
counthowmany(X, [X|Q], N) :- counthowmany(X, Q, N1), N is N1+1.
counthowmany(X, [Y|Q], N) :- X \== Y, counthowmany(X, Q, N).
以下是一个解决方案:

counthowmany(_, [], 0) :- !.
counthowmany(X, [X|Q], N) :- !, counthowmany(X, Q, N1), N is N1+1.
counthowmany(X, [_|Q], N) :- counthowmany(X, Q, N).
第一行是终止测试:在空列表上,计数为零。另外两行是递归调用,如果第一个元素匹配(第2行),则计数递增

这是一个类似但纯逻辑的版本(无切割),正如大流士所建议的:

counthowmany(_, [], 0).
counthowmany(X, [X|Q], N) :- counthowmany(X, Q, N1), N is N1+1.
counthowmany(X, [Y|Q], N) :- X \== Y, counthowmany(X, Q, N).

这里是一个替代实现。这是使用累加器的尾部递归

countwords(X,L,N) :- countwords(X,L,0,N),!.
countwords(X,[],N,N).
countwords(X,[X|T],P,N) :- P1 is P+1 , countwords(X,T,P1,N).
countwords(X,[H|T],P,N) :- X\==H , countwords(X,T,P,N).

这里是一个替代实现。这是使用累加器的尾部递归

countwords(X,L,N) :- countwords(X,L,0,N),!.
countwords(X,[],N,N).
countwords(X,[X|T],P,N) :- P1 is P+1 , countwords(X,T,P1,N).
countwords(X,[H|T],P,N) :- X\==H , countwords(X,T,P,N).
将“平等”与具体化术语“平等”结合使用,如下所示:

?- tcount(=(hello),[hello,how,are,you,hello,hello],N).
N = 3.                          % succeeds deterministically
将“平等”与具体化术语“平等”结合使用,如下所示:

?- tcount(=(hello),[hello,how,are,you,hello,hello],N).
N = 3.                          % succeeds deterministically
更好的回答

countWord([],0).
countWord([_|List], A):- countWord(List,B), A is B+1.
更好的回答

countWord([],0).
countWord([_|List], A):- countWord(List,B), A is B+1.

这闻起来像是家庭作业。这闻起来像是一个合理的问题,任何其他问题都应该得到答案。啊*,序言。。。我记得我把狼,山羊,卷心菜的问题作为一项任务来做。。。哦,痛苦的回忆!我认为在序言中没有for循环,它必须是递归的,你在使用哪种语言?这闻起来像是家庭作业。这闻起来像是一个合理的问题,任何其他问题都应该得到答案。啊*,序言。。。我记得我把狼,山羊,卷心菜的问题作为一项任务来做。。。哦,痛苦的回忆!我认为在prolog中没有for循环,它必须是递归的。你使用哪种语言?我会在没有任何删减的情况下编写它,而是在最后一个子句中使用一个不等于测试,因为纯粹的逻辑定义不太容易出错。通过使用
dif/2
而不是
(\==)/2
来保留!关于
dif
的更多信息在这里:我会在没有任何删减的情况下编写它,而是在最后一个子句中使用一个不等于测试,因为纯粹的逻辑定义不太容易出错。通过使用
dif/2
而不是
(\==)/2
来保存它!有关dif的更多信息,请参见: