如何在Prolog中将所有非数字合并到一个列表中?

如何在Prolog中将所有非数字合并到一个列表中?,prolog,Prolog,我有基本情况 variable_part(X) :- var(X), !. variable_part(X) :- number(X). variable_part(X+Y) :- variable_part(X), variable_part(Y). variable_part(X-Y) :- variable_part(X), variable_part(Y). 我试图使列表中的所有元素都具有Atom*形式的编号,并对其进行排序,但我不确定从何处开始。您需要一个包含变量列表的附加参数。在变

我有基本情况

variable_part(X) :- var(X), !.
variable_part(X) :- number(X).
variable_part(X+Y) :- variable_part(X), variable_part(Y).
variable_part(X-Y) :- variable_part(X), variable_part(Y).

我试图使列表中的所有元素都具有Atom*形式的编号,并对其进行排序,但我不确定从何处开始。

您需要一个包含变量列表的附加参数。在变量基情况下,您收集变量,在数字基情况下,您不:

variable_part(X,[X]) :- var(X).
variable_part(X,[]) :- number(X).
对于递归,您需要组合变量列表:

variable_part(Op,Vars) :-
    nonvar(Op),
    Op = X + Y,
    variable_part(X,V1),
    variable_part(Y,V2),
    append(V1,V2,Vars).
我还从基本情况中删除了cut,并将其替换为显式的nonvar检查,然后对递归情况进行统一。作为下一步,您可以使用将变量组合到乘法表示中的谓词替换append(或者作为后处理步骤)。通过选择原子来表示方程系统的变量,你可能会使你的生活变得更容易(也可以参见这篇“干净”与“默认”表示法的对比)

并将其用于如下查询:

?- variable_part((23+v(x))-(v(y)-v(x)), Vs).
Vs = [(x, 1),  (y, 1),  (x, 1)] ;
false.
然后,您只需浏览列表并添加系数,而无需担心会意外地统一Prolog变量。

您是否也希望“例如,变量部分(5-(3+x),N)在N=2时应成功”?
?- variable_part((23+v(x))-(v(y)-v(x)), Vs).
Vs = [(x, 1),  (y, 1),  (x, 1)] ;
false.