这是问题所在。我想做一个序言程序,count(a*b*c, * , N)
它会计算*
in a*b*c
和 return N=2
。
我怎样才能做到这一点?
我做了一些研究,要么将其作为 s 字符串传递,要么使用列表来分隔a*b*c
.
然而,到目前为止,没有任何事情是成功的。
该表达式a*b*c
是一个简化的复合项:
?- write_canonical(a*b*c).
*(*(a,b),c)
你可以看到这*
只是一个二元关系的函子,表达式树的访问可以使用内置的univ来完成:
count(Expression, Request, N) :-
( Expression =.. [Op, Left, Right]
-> count(Left, Request, NLeft),
count(Right, Request, NRight),
( Request == Op
-> N is NLeft + NRight + 1
; N is NLeft + NRight
)
; N = 0
).
这接受带有任何二元运算符的树表达式,但也可以,例如
?- count(e(a,e(b,c)),e,N).
N = 2.
它只会计算 * 但修改它以计算其他东西应该很困难:
main :-
atom_chars('a*b*c', CharList),
star_counter(CharList, Count),
write(Count).
star_counter([], 0).
star_counter(['*'|R], Count) :-
star_counter(R, Sum),
Count is Sum + 1.
star_counter([H|R], Count) :-
star_counter(R, Count).
编辑这是一个版本,其中包含您要查找的字符的参数:
main :-
atom_chars('a*b*c', CharList),
star_counter('*',CharList, Count),
write(Count).
star_counter(_,[], 0).
star_counter(X,[X|R], Count) :-
star_counter(X,R, Sum),
Count is Sum + 1.
star_counter(X,[_|R], Count) :-
star_counter(X,R, Count).