相关疑难解决方法(0)

将谓词应用于列表元素的Prolog映射过程

如何编写map(List, PredName, Result)将谓词应用于PredName(Arg, Res)元素的Prolog过程,并将List结果返回到列表中Result

例如:

test(N,R) :- R is N*N.

?- map([3,5,-2], test, L).
L = [9,25,4] ;
no
Run Code Online (Sandbox Code Playgroud)

prolog meta-predicate map-function

35
推荐指数
1
解决办法
2万
查看次数

学习Prolog:解决填字游戏计划

我正在尝试学习网站Prolog上的教程,我找不到练习的解决方案(并且网站上没有解决方案).

这就是我要做的事情:

这里有六个意大利语单词:

astante,astoria,baratto,cobalto,pistola,statale.

它们将被安排,填字游戏时尚,在以下网格中:

方案

以下知识库代表包含以下单词的词典:

  • 字(astante,a,s,t,a,n,t,e).
  • 单词(astoria,a,s,t,o,r,i,a).
  • 字(baratto,b,a,r,a,t,t,o).
  • 单词(cobalto,c,o,b,a,l,t,o).
  • 字(pistola,p,i,s,t,o,l,a).
  • 字(statale,s,t,a,t,a,l,e).

写一个谓词填字游戏/ 6告诉我们如何填写网格.前三个参数应该是从左到右的垂直单词,最后三个参数是从上到下的水平单词.

现在,同样的问题已被问到,但每个给定的解决方案使用我不知道的东西(我不应该知道解决这个问题).

为了澄清,虽然链接问题中的内容确实有效,但他们使用的内容尚未在我所遵循的指南中解释,这意味着我需要在使用那种东西的情况下解决练习,所以没有maplist和那样的事情.

我的想法是用给定单词中的字母填充董事会,但有一些限制:

  • V1中的单词必须具有H1中单词的第二个字符作为其第二个字符
  • V1中的单词必须具有H2中单词的第二个字符作为其第四个字符
  • V1中的单词必须具有H3中单词的第二个字符作为其第六个字符

等等..

所以这是我的代码:

word(astante,  a,s,t,a,n,t,e).
word(astoria,  a,s,t,o,r,i,a).
word(baratto,  b,a,r,a,t,t,o).
word(cobalto,  c,o,b,a,l,t,o).
word(pistola,  p,i,s,t,o,l,a).
word(statale,  s,t,a,t,a,l,e). 

crossword(V1,V2,V3,H1,H2,H3):- word(V1, V11,V12,V13,V14,V15,V16,V17),
                               word(H1, H11,V12,H13,H14,H15,H16,H17),
                               word(H2, H21,V14,H23,H24,H25,H26,H27),
                               word(H3, H31,V16,H33,H34,H35,H36,H37),

                               word(V2, V21,V22,V23,V24,V25,V26,V27),
                               word(H1, H11,H12,H13,V22,H15,H16,H17),
                               word(H2, H21,H22,H23,V24,H25,H26,H27),
                               word(H3, H31,H32,H33,V26,H35,H36,H37),

                               word(V3, V31,V32,V33,V34,V35,V36,V37),
                               word(H1, H11,H12,H13,H14,H15,V32,H17),
                               word(H2, H21,H22,H23,H24,H25,V34,H27),
                               word(H3, H31,H23,H33,H34,H35,V36,H37). 
Run Code Online (Sandbox Code Playgroud)

(如果格式不正确,我很抱歉,但我仍然不知道什么是正确的缩进样式Prolog).

当然,事件,如果我的想法似乎是正确的(至少对我而言),这段代码返回No,我不知道为什么.

有什么暗示吗? …

prolog crossword

6
推荐指数
2
解决办法
5232
查看次数

如何解决Prolog中的密码算术难题

我必须编写一个Prolog程序来解决一个密码算术难题.

我需要编写一个函数solve([A,M,P,D,Y]),它将变量[A,M,P,D,Y]分配给0到9之间的值,使其满足方程AM + PM = DAY.每个变量都分配给一个不同的值,A,P和D不能等于0.

我开始编写这个函数,但在运行程序时遇到了问题.我将A,P和D的限制设置为不为零.当我通过算法时,我意识到D必须是1,所以我在程序的开头定义了它.我为M(M1和M2)定义了两个不同的变量,并将它们设置为彼此相等,因为拼图中的不同M应分配给相同的值.我为不同的变量分配了位置,并根据拼图添加了它们.我考虑了随附变量携带的任何变量.我的程序编译但函数不执行.

solve([A, M1, M2, P, D, Y]):- D is 1,
A/=0,
P/=0,
D/=0,
M1 = M2,
select(M1, [0,2,3,4,5,6,7,8,9], R1),
select(M2, R1, R2),
Y is (M1+M2) mod 10,
C1 is (M1+M2) // 10,
select(Y, R2, R3),
select(A, R3, R4),
select(P, R4, R5),
select(D, R5, R6),
A is (A+P+C1) mod 10,
D is (A+P+C1)// 10.
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?我的变量定义有问题吗?我需要定义两个不同的M变量,还是一个足够?

prolog clpfd cryptarithmetic-puzzle

5
推荐指数
1
解决办法
5710
查看次数