为什么 Prolog 看不到明显的答案?

Why Prolog can't see the obvious answer?

f(9) = f(A), X = A, X = T * T

为什么 prolog 看不到 A = 9,X = 9,T = 3/-3,我这里是不是语法错误?如果是这样,这个查询的正确形式是什么?我弄错了,但显然这个等式有一个简单的答案。

从某种意义上说,您犯了一个有趣的错误,因为您神奇地期望序言能够从约束 (X=T*T) 中推导出解决方案(注意:这是一件好事,这是一个非常序言的期望).有两件事在这里不起作用

  • 为了让 prolog 了解您想要计算数学表达式,您需要使用“is”而不是 equal
  • 你需要给 prolog 一个关于什么值可能适用于 T
  • 的提示

这里有一些与您正在尝试的东西相近的东西可以工作

f(9) = f(A), X = A, between(-100,100,T), X is T * T

除了@madeofmistake 已经提出的好的解决方案之外,另一种选择是使用 constraint logic programming over finite domains (clpfd) 的库。加载此库后,您可以使用运算符 #= 计算算术约束。

?- use_module(library(clpfd)).
true.

?- f(9) = f(A), X = A, X #= T * T.
A = X, X = 9,
T in -3 \/ 3.