2012-05-28 19 views
0

你好,我有一個返回的例子均衡給定列表中的謂語序言,轉換期限爲列表

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

現在我想這個結果變成像這樣的列表:

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

如何我可以這樣做嗎?

回答

3

最簡單的解決方案是遍歷一個術語,創建一個小列表的列表,然後將所有東西弄平。然而,最簡單的解決方法是不是最優雅的一個 - 引述SWI Prolog flatten/2 manual

結束了需要拼合/ 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). 

顯然,目前的解決方案僅適用於二進制操作。如果允許使用任意數量參數的操作,則需要對參數進行另一次遍歷。

+0

爲什麼不使用DCG? – false

+0

沒有理由,DCG當然會做得很好。 –

1

查看(=..)/2運營商的工作方式。

如果你想檢查表達式是否相同,使用(=:=)/2而不是(=)/2