我正在做一个序言任务,我目前非常接近解决方案。所以,这个问题是一个约束满足问题,我必须找到一组变量的值,使得某些条件为真。具体来说,给定 3 个单词 (W1,W2,W3),分配它们的变量,使得 W1+W2=W3。这方面的一个例子是 SEND+MORE=MONEY,或 IT+IS=ME。
约束是:(1) 它们必须正确相加,(2) 起始字母不能为 0 (3) 并且所有变量必须是不同的。它必须适用于一般的文字问题。当我尝试确保它们正确加起来时,我的问题正在发生(我已经满足其他条件并且我理解问题)。就第二个单词问题而言,我们应该有:
10*I + 1*T
+10*I + 1*S
___________
10*M + 1*E
因此,我创建了一个函数,可以在一定长度内列出 10 的幂,如下所示:
powlist(1,L) :-
append([1.0],[],L).
powlist(N,L) :-
N1 is N-1,
X is 10**N1,
powlist(N1,L1),
append([X],L1,L),
!.
我也有实际的字母列表,比如 [I,T,I,S,M,E]。然后,我从 powlist 中构造了一个系数列表(稍后我将解释该部分),因此我们有如下内容:[10,1,10,1,-10,-1]。我这样做了,如果我们在这个系数列表和字母列表之间进行点积,并且它为零,那么约束就会得到满足。但是,我无法让这个点积理论起作用。我目前有一行说:
scalar_product(Coefficients, Letters, #=, 0)
但这给了我以下错误:
!is/2 的参数 2 中的实例化错误
!目标:_102 是 0+10.0*_109
我不确定如何定义点积,以便它可以处理变量(而不仅仅是原子)。其余所有代码都可以完美运行(我不想把它放在这里,因为这是入门序言课程的一个非常常见的问题,我不想给懒惰的人答案)。你们有什么建议?