你好我有一个谓词,返回给定列表的示例均衡
equalisation([1,2,3,4,12],L).
L = (1=2-3* (4/12))
现在我想将此结果更改为如下列表:
L = [1,=,2,-,3,*,4,/,12]
我该怎么做?
答案 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
。