0

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

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

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

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

我怎样才能做到这一点?

4

2 回答 2

3

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

最终需要 flatten/3 通常表明,例如 append/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).

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

于 2012-05-28T19:08:40.690 回答
1

查看(=..)/2操作员的工作方式。

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

于 2012-05-28T18:20:10.533 回答