扁平术语Prolog

时间:2015-01-17 13:46:06

标签: prolog

我是Prolog的新手,我试图解决这个问题,所以我希望有人可以提供帮助 我想实现一个三元谓词flatten_term(Term, Function_symbol, Flattened_term)    如果Flattened_termTerm获得,则可以取消所有成功    嵌套出现Function_symbol。假设Term包含否    没有检查列表的Prolog变量和没有列表。

?- flatten_term(f(f(x)), f, Flattened_term).
Flattened_term = f(x).

?- flatten_term(f(x), f, Flattened_term).
 Flattened_term = f(x).

 ?- flatten_term(a, f, Flattened_term).
Flattened_term = a.

?- flatten_term(g(f(x)), f, Flattened_term).
Flattened_term = g(f(x)).

?- flatten_term(g(f(f(x))), f, Flattened_term).
Flattened_term = g(f(x)).

2 个答案:

答案 0 :(得分:1)

我使用下面的代码来计算术语中的项目。也许这与你想要的相似?

?- flatten_term(5+3*x=10,List).
List = [=, +, 5, *, 3, x, 10].

这是源代码:

flatten_term(Term,[Term]):-
    atomic(Term),!.
flatten_term(Term,Flat):-
    Term =.. TermList,
    flatten_term_list(TermList,Flat),!.

flatten_term_list([],[]):-!.
flatten_term_list([H|T],List):-
    flatten_term(H,HList),
    flatten_term_list(T,TList),
    append(HList,TList,List),!.

答案 1 :(得分:0)

如上所述,你真的应该展示你的工作的一个例子。但是,这里有一些提示让你开始:

  1. 展平像[a,[b,c],d,[e,[f,g,h]]]这样的列表列表只是一个简单的递归树步行。 Stack Overflow上有几个问题,演示了如何执行此操作,例如,这个问题How to implement flatten list in prolog ,with tail recursion?

  2. 有许多关于类型检查以及术语的分析,构造和分解的谓词:

  3. 特别是,可以使用 univ 运算符=../2将复合术语分解为列表:

    foo(alpha,bravo,charlie) =.. L
    

    产生L = [foo,alpha,bravo,charlie]

    还应注意' = .. / 2`用于将列表转换为复合词:

    T =.. [foo,alpha,bravo,charlie]
    

    正如人们所期望的那样产生T = foo(alpha,bravo,charlie)

  4. 祝你好运!