我是Prolog的新手,我正在尝试解决这样的问题,所以我希望有人能帮上忙。
我想实现一个三元谓词flatten_term(Term, Function_symbol, Flattened_term),如果Flattened_term是通过展平所有嵌套出现的Function_symbol从Term获得的,那么它就会成功。假设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)).发布于 2015-04-16 04:29:41
我使用下面的代码来计算一个学期中的项目。也许这和你要找的东西很相似?
?- 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),!.发布于 2015-01-21 02:52:38
正如前面提到的,你真的应该展示一个你的工作的例子。但是,这里有一些提示来帮助你开始:
[a,[b,c],d,[e,[f,g,h]]]这样的列表列表只是一个简单的递归树遍历。这里有几个关于堆栈溢出的问题来演示如何做到这一点,例如,这个问题,How to implement flatten list in prolog ,with tail recursion?- [http://www.swi-prolog.org/pldoc/man?section=typetest](http://www.swi-prolog.org/pldoc/man?section=typetest)
- [http://www.swi-prolog.org/pldoc/man?section=manipterm](http://www.swi-prolog.org/pldoc/man?section=manipterm)
特别是
=../2将复合术语分解为一个列表:foo(alpha,bravo,charlie) =..我
这会产生L = [foo,alpha,bravo,charlie]。
还需要注意的是:'=../2is used to convert a list into a compound term: T =.. [foo,alpha,bravo,charlie] which yields, as one might expectT = foo(alpha,bravo,charlie)`。
祝好运!
https://stackoverflow.com/questions/28000090
复制相似问题