统一列表中的所有自由变量,值为1 - SWI Prolog

时间:2014-05-12 22:42:07

标签: prolog

我正在研究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).

有什么建议吗?

1 个答案:

答案 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/2findall/3都是标准的内置谓词。 member/2通常可以作为内置谓词或库谓词使用。