您收到实例化错误的原因是,在将它们用作目标时,对它们知之甚少,也P
无话可说Q
。例如,当您询问时,您是对的:
?- G.
thenG = true
是使查询成功的解决方案。但例如也是如此,G = (a=a)
因为a=a
也是如此。由于无法枚举所有G
成功的目标,因此会出现实例化错误。但是请注意,例如,当您显式提供绑定时,您会得到预期的结果:
?- G = true, G.
G = true.
因此,您应该提供一组您感兴趣的值:
?- maplist(boolean, [P,Q]), formula(P, Q).
并定义例如:
boolean(true).
boolean(false).
以获得具体的解决方案。或者使用约束,它可以让你在使用变量之前约束它们的域。
编辑:由于对此进行了一些讨论,因此我将进行更详细的讨论。出现的主要问题是:为什么查询
?- Q.
没有唯一的解决方案成功
Q = true.
因为显然,true
成功,因此是一个有效的解决方案?回答:还有其他可能的答案,因为true
这不是唯一成功的目标。例如,连词(true,true)
也成功。现在假设这Q = true
是上述查询的唯一解决方案,那么情况将是:
?- Q, Q = (true, true).
失败(因为dif(true, (true,true))
它本身就是真的),但只是简单地交换目标
?- Q = (true,true), Q.
成功,因为否则?- true, true
也将失败,而事实并非如此。对于最基本的谓词(统一),这已经违反了合取的交换性。
请注意,虽然true
和(true,true)
都在作为目标执行时成功,但它们显然是不同的术语,通常不能相互替代。类似地,术语与术语append([], [], [])
不同true
,尽管两者在作为目标执行时都会成功。Q
因此,您会遇到实例化错误,因为在查询?- Q.
中对提供有用结果的了解太少。