以下成绩单可能证明很有启发性:
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
给定的,第arg
一个Term
is Val1
, is 的函子Val1
与F1
arity A1
(意思是,它具有A1
args - 子部分 - 本身),并且arg
术语 inVal1
的第二个存储在Val12
name 下。为了澄清,Prolog 中的任何符号数据都采用fff(aa,bb,cc,...)
where fff
is some name 的形式,称为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
编辑:回答您的其他问题(来自评论):
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