这是问题所在。我想在count(a*b*c, * , N)
上做一个prolog程序,它将计算*
中的a*b*c
并返回N=2
。
我怎样才能实现这个目标?
我做了一些研究,要么将其作为s字符串传递,要么使用列表来分隔a*b*c
。
然而,到目前为止,没有什么是成功的。
答案 0 :(得分:3)
表达式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.
答案 1 :(得分:3)
它只会计算*,但修改它以计算其他事情应该是如此困难:
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).