以下文字记录可能很有启发性:
32 ?- Term = (3*_X + 5*_Y = 10), functor(Term,F,A).
Term = 3*_G527+5*_G530=10
F = =
A = 2
33 ?- Term = (3*_X + 5*_Y = 10), arg(Arg,Term,Val).
Term = 3*_G459+5*_G462=10
Arg = 1
Val = 3*_G459+5*_G462 ; % user pressed ';' interactively
Term = 3*_G459+5*_G462=10
Arg = 2
Val = 10 ; % user pressed ';' interactively
No
35 ?- Term = (3*_X + 5*_Y = 10), arg(1,Term,Val1), functor(Val1,F1,A1),
arg(2,Val1,Val12).
Term = 3*_G693+5*_G696=10
Val1 = 3*_G693+5*_G696
F1 = +
A1 = 2
Val12 = 5*_G696
最后一个查询内容为:对于给定的Term,Term 的第一个arg 是Val1,Val1 的函子是F1 与arity A1(意思是,它有@987654329 @ args - 子部分 - 本身),并且 Val1 中术语的第二个 arg 存储在 Val12 名称下。澄清一下,Prolog 中的任何符号数据都采用fff(aa,bb,cc,...) 的形式,其中fff 是某个名称,称为functor,并且可以通过arg 访问该表达式中的“参数”打电话。
这意味着原始表达式(3*_X + 5*_Y = 10)实际上存储在Prolog中为'='( '+'( '*'(3,_X), '*'(5,_Y)), 10)。当您到达原子部分(arity 为 0 的函子)时,您可以进一步检查它们:
47 ?- arg(1,(3*X),V), functor(V,F,A), number(V).
X = _G441
V = 3
F = 3
A = 0
Yes
编辑:回答您的其他问题(来自 cmets):
1 ?- (3*_X + 5*_Y = 10) = (A*X + B*Y = C).
A = 3
X = _G412
B = 5
Y = _G415
C = 10
Yes
如果您坚持不明确写出乘号 *,则必须将您的术语表示为字符串,并分析该字符串。那将是一项更复杂的任务。
编辑:要尝试的另一件事是=.. 谓词,称为“Univ”:
4 ?- (3*_X + 5*_Y = 10) =.. X.
X = [=, 3*_G454+5*_G457, 10]
Yes
5 ?- (3*_X + 5*_Y = 10) =.. X, X=[X1,X2,X3], X2 =.. Y.
X = [=, 3*_G545+5*_G548, 10]
X1 = =
X2 = 3*_G545+5*_G548
X3 = 10
Y = [+, 3*_G545, 5*_G548]
Yes