我是Prolog的新手,我试图解决这个问题,所以我希望有人可以提供帮助
我想实现一个三元谓词flatten_term(Term, Function_symbol, Flattened_term)
如果Flattened_term
从Term
获得,则可以取消所有成功
嵌套出现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)).
答案 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)
如上所述,你真的应该展示你的工作的一个例子。但是,这里有一些提示让你开始:
展平像[a,[b,c],d,[e,[f,g,h]]]
这样的列表列表只是一个简单的递归树步行。 Stack Overflow上有几个问题,演示了如何执行此操作,例如,这个问题How to implement flatten list in prolog ,with tail recursion?
有许多关于类型检查以及术语的分析,构造和分解的谓词:
特别是,可以使用 univ 运算符=../2
将复合术语分解为列表:
foo(alpha,bravo,charlie) =.. L
产生L = [foo,alpha,bravo,charlie]
。
还应注意' = .. / 2`用于将列表转换为复合词:
T =.. [foo,alpha,bravo,charlie]
正如人们所期望的那样产生T = foo(alpha,bravo,charlie)
。