替換列表的元素我有一個謂語variablize/3
是獲得一個列表,並替換每個項目,反過來,有一個變量,例如:在序言
% ?- variablize([a,b,c], X, L). % L = [[X, b, c], [a, X, c], [a, b, X]]
現在我要擴展這個謂詞接受變量列表,例如:
% ?- variablize([a,b,c], [X,Y], L). % L = [[X, Y, c], [X, b, Y], [a, X, Y]]
到目前爲止我的代碼是:
replace_at([_|Tail], X, 1, [X|Tail]). replace_at([Head|Tail], X, N, [Head|R]) :- M is N - 1, replace_at(Tail, X, M, R). replace_each([], _, _, [], _). replace_each([_|Next], Orig, X, [Res|L], N) :- replace_at(Orig, X, N, Res), M is N + 1, replace_each(Next, Orig, X, L, M). variablize(I, X, L) :- replace_each(I, I, X, L, 1).
任何指針?我是否擴展replace_at/4
以擁有應該跳過的索引列表?
這是非常不尋常的寫到哪nonvariable項由變量替換謂詞。你能解釋爲什麼你需要這個嗎?大多數情況下,相反地構建術語要有效得多。 – false 2012-04-16 18:18:05
@false我將它用於基本的NLP。用戶可以輸入'變量'('[employees,of,acme]')而不是模型中的術語('[employees,of,company]'),因此我可以建議該單詞的'type'類型搜索數據庫索引。我是這個初學者,所以我沒有做任何愚蠢的事情嗎? – Radek 2012-04-16 22:24:11
它確實在你的上下文中有意義。然而,你的程序中必須有很多'var/1''nonvar/1'測試。你可以(也許)避免其中的一些。 – false 2012-04-16 22:33:15