首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有变量的Prolog点积(约束满意度)

带有变量的Prolog点积(约束满意度)
EN

Stack Overflow用户
提问于 2011-04-11 22:49:12
回答 1查看 750关注 0票数 2

我正在做一个prolog任务,目前我非常接近这个解决方案。因此,这个问题是一个约束满足问题,在这个问题中,我必须为一组变量找到值,这样某些条件才是真的。具体来说,给出三个单词(W1,W2,W3),指定它们的变量,比如W1+W2=W3。这方面的一个例子是SEND+MORE=MONEY,或IT+IS=ME。

约束条件是:(1)它们必须正确地加起来,(2)起首字母不能是0 (3),所有变量必须是不同的。它必须解决一个一般性的单词问题。我的问题发生在我试图确保它们的累积正确的时候(我已经满足了其他条件,我理解这个问题)。关于第二个词的问题,我们应该有:

代码语言:javascript
复制
 10*I + 1*T
+10*I + 1*S
___________
 10*M + 1*E

因此,我做了一个函数,在一定长度内列出10项权力,如下所示:

代码语言:javascript
复制
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。然后我从粉状列表中构造了一个系数列表(稍后我将对此部分进行解释),所以我们有如下内容:10,1,10,-10,-1。我这样做了,如果我们取这个系数列表和字母列表之间的点乘积,它是零,约束就满足了。但是,我不能让这个点积理论起作用。我现在有一句话说:

代码语言:javascript
复制
   scalar_product(Coefficients, Letters, #=, 0)

但这给了我以下错误:

好了!is/2参数2中的实例化错误

好了!目标:_102是0+10.0*_109

我不知道如何定义点积,这样它就可以处理变量(而不仅仅是原子)。其余的代码都工作得很完美(我不想把它放在这里,因为这是prolog入门课程的一个非常常见的问题,我不想给懒惰的人答案)。你们有什么建议?

EN

回答 1

Stack Overflow用户

发布于 2011-04-12 05:08:47

您的策略确实是合理的,而且确实有效,至少在使用内置scalar_product/4的strategy (FD)中是这样的。我不熟悉SICStus中这个谓词的定义,但它的接口似乎与SWI中的相同。

我可以提几个建议。首先,您编写的代码的某些方面可能是生成选择点,当在回溯中执行这些选择点时(例如,为了寻找替代解决方案,例如通过label/1),解释器执行子目标_102 is 0+10.0*_109,其中_109是无意中不受约束的。你写过包含这样一行的谓词吗?即使不是,我建议再次检查您的代码,以确保它们不会产生不必要的选择点,例如您对powlist/2的定义。我建议您尝试以下方法:

代码语言:javascript
复制
powlist(1, [1]) :- !.
powlist(N, [F|Fs]) :-
    N > 1,
    N1 is N - 1,
    F is 10 ** N1,
    powlist(N1, Fs).

这个版本没有给Prolog解释器留下回溯的选择点,这可能解决问题(不过,没有看到更多的代码,我就说不出来了)。

否则,如果您是正确的,并且错误确实来自于scalar_product/4的定义(尽管我会感到惊讶),那么也许您可以手动地生成标量产品约束项并将其添加到存储中。例如,考虑:

代码语言:javascript
复制
my_scalar_product([V|Vs], [C|Cs], Op, Value) :-
    construct_constraint(Vs, Cs, (V * C), Constr),
    Constraint =.. [Op, Constr, Value],
    Constraint.

construct_constraint([], [], Acc, Acc).
construct_constraint([V|Vs], [F|Fs], Acc, Res) :-
    construct_constraint(Vs, Fs, '+'(Acc, (V * F)), Res).

此版本(my_scalar_product/4)假设与内置scalar_product/4具有相同的接口,但它将约束添加到存储区,而不是尝试使用is/2执行约束。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5628451

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档