Prolog,将术语转换为列表

时间:2012-05-28 17:48:08

标签: list prolog term

你好我有一个谓词,返回给定列表的示例均衡

equalisation([1,2,3,4,12],L).
L = (1=2-3* (4/12)) 

现在我想将此结果更改为如下列表:

L = [1,=,2,-,3,*,4,/,12]

我该怎么做?

2 个答案:

答案 0 :(得分:3)

最简单的解决方案是遍历一个术语,创建一个小列表列表,然后展平所有内容。但是,最简单的解决方案并不是最优雅的解决方案 - 引用SWI Prolog flatten/2 manual

  

结束需要flatten / 3经常表示,如追加/ 3附加两个列表,一个糟糕的设计。从生成的小列表生成列表的高效代码必须使用差异列表,通常可以通过语法规则来实现最佳可读性。

所以这是使用差异列表的替代解决方案:

t2l(Term, List) :- t2l_(Term, List-X), X = [].

t2l_(Term, [F|X]-X) :- Term =.. [F], !.
t2l_(Term, L1-L4) :- Term =.. [F, A1, A2], 
                     t2l_(A1, L1-L2), 
                     L2 = [F|L3], 
                     t2l_(A2, L3-L4).

显然,当前的解决方案仅适用于二进制操作。如果允许具有任意数量参数的操作,则需要对参数进行另一次遍历。

答案 1 :(得分:1)

查看(=..)/2运算符的工作原理。

如果您想检查表达式是否相等,请使用(=:=)/2代替(=)/2