prolog解析操作问题

时间:2012-09-14 16:15:21

标签: parsing prolog

这是问题所在。我想在count(a*b*c, * , N)上做一个prolog程序,它将计算*中的a*b*c并返回N=2

我怎样才能实现这个目标?

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

然而,到目前为止,没有什么是成功的。

2 个答案:

答案 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).