我正在研究SWI-Prolog。
给出以下键值对列表:
List = [pair(key1,1), pair(key2,1), pair(key3,_G1), pair(key4,-_G1), pair(key5,- -_G1)]
注意:在这种情况下,唯一的自由变量是G1,但可能有多个自由变量。
该对的值(Key,Value)可以设置为1.
否则它属于{Var,-Var, - -Var, - - -Var,..., - - - ... -Var}
组我想将Var与值1统一起来。
在没有解析Value的情况下,有没有优雅的方法呢?
我尝试了numbervars谓词,但它只会在变量中写入字母。
我也有一个解决它的工作谓词,但我正在寻找一种更优雅的方式。
fixFreeVars([]).
fixFreeVars([kvp(_,X)|KVPs]) :-
fixFreeVar(X),!,
fixFreeVars(KVPs).
fixFreeVar(X) :- var(X), X = 1.
fixFreeVar(-X) :- fixFreeVar(X).
fixFreeVar(X) :- nonvar(X).
有什么建议吗?
答案 0 :(得分:3)
有几种方法可以做到。一个紧凑的解决方案是:
fix_free_variables(Term) :-
term_variables(Term, Variables),
findall(1, member(1, Variables), Variables).
示例电话:
?- fix_free_variables([pair(key1,1), pair(key2,1), pair(key3,_G1), pair(key4,-_G1), pair(key5,- -_G1)]).
_G1 = 1.
?- fix_free_variables([pair(key1,1), pair(key2,1), pair(key3,_G1), pair(key4,-_G2), pair(key5,- -_G3)]).
_G1 = _G2, _G2 = _G3, _G3 = 1.
term_variables/2
和findall/3
都是标准的内置谓词。 member/2
通常可以作为内置谓词或库谓词使用。