你好,我有一個返回的例子均衡給定列表中的謂語序言,轉換期限爲列表
equalisation([1,2,3,4,12],L).
L = (1=2-3* (4/12))
現在我想這個結果變成像這樣的列表:
L = [1,=,2,-,3,*,4,/,12]
如何我可以這樣做嗎?
你好,我有一個返回的例子均衡給定列表中的謂語序言,轉換期限爲列表
equalisation([1,2,3,4,12],L).
L = (1=2-3* (4/12))
現在我想這個結果變成像這樣的列表:
L = [1,=,2,-,3,*,4,/,12]
如何我可以這樣做嗎?
最簡單的解決方案是遍歷一個術語,創建一個小列表的列表,然後將所有東西弄平。然而,最簡單的解決方法是不是最優雅的一個 - 引述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).
顯然,目前的解決方案僅適用於二進制操作。如果允許使用任意數量參數的操作,則需要對參數進行另一次遍歷。
查看(=..)/2
運營商的工作方式。
如果你想檢查表達式是否相同,使用(=:=)/2
而不是(=)/2
。
爲什麼不使用DCG? – false
沒有理由,DCG當然會做得很好。 –