2

这是问题所在。我想做一个序言程序,count(a*b*c, * , N)它会计算*in a*b*c和 return N=2

我怎样才能做到这一点?

我做了一些研究,要么将其作为 s 字符串传递,要么使用列表来分隔a*b*c.

然而,到目前为止,没有任何事情是成功的。

4

2 回答 2

2

该表达式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.
于 2012-09-14T18:06:27.853 回答
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).
于 2012-09-14T18:10:00.377 回答