2011-11-26 60 views
1

我在基本Prolog中寻求帮助,这是一种语言难以掌握的语言。我对其他语言(C++,Lisp,Java,Assembly等)非常熟悉,但是对于Prolog来说,这是一个完整的新手。在Prolog中使用2D数组

什么需要解决 - 在基础英语中:给定2个参数,在2D阵列中找到相应的数字。

这个问题是一个无脑的简单的谜题在网上,要求你选择一个数字,选择数字的颜色,然后选择包含您给定的数字的房子。拼图的设置使每个相应的颜色/房屋组合只有一个数字。

目前什么是地点:

function guess(Color, Houses) :- 
<--Need what goes here --> 

green(1, 15, 23, 24). 
pink(2, 6, 10, 18). 
etc... 

houseA(2, 4, 7, 14). 
etc... 

的代码必须在颜色和房屋匹配挑选出正确的数字。因此,例如,给出"?- guess(pink, houseA)"应该返回"Your number is 2."

我一直在写下关于如何在prolog中实现这个想法,并没有一个让我更进一步。我不知道如何实现if/else语句来检查我应该搜索哪种颜色,或者如何检查房屋和颜色之间的对应关系,甚至是如何“返回”值!

在我看来,我错过了一个关键点或思考语言的方式。

任何帮助,将不胜感激。谢谢!

回答

1

要返回一个值,需要在谓词中使用另一个参数(不是函数btw)。这个参数将是一个自由变量,你将它绑定到结果。

在序言规范中,记录了这些参数 - 记录了已绑定参数的参数+记录了可以绑定和释放的参数和参数?参数。所以在这里给你,你可以有一个评论,如:

% guess/3 (specify the arity of your predicate) 
% guess(+Color, +House, -Result) (give info about your parameters) 
% guess finds a color shared by Color and House and binds it to Result. 

然后,谓语,如粉红,houseA等并非很大,从查找号码。您可以通过具有存储在列表数字把他们变成更适应断言:

green([1, 15, 23, 24]). 
pink([2, 6, 10, 18]). 
houseA([2, 4, 7, 14]). 

当我们拿到这个列表中,我们可以这样写:

guess(Color, House, Result) :- 
    call(Color, Pool1), 

如果你调用的猜测(粉红色,houseA)这将使用参数Pool1调用你的谓词pink,prolog将尝试匹配Pool1和[2,6,10,18],因此Pool1将被精确地绑定到这个列表。

call(House, Pool2), 

与houseA和Pool2一样。

member(Result, Pool1), 

现在我们告诉序言,我们希望我们的结果是库1

member(Result, Pool2), 

的成员,池2中的一员。

write('Your number is '), 
    write(Result), 
    write(.), 
    nl. 

最后我们显示消息。

Prolog将显示结果为R = x;如果你不想要这个,那么在下面就是假的。假的部分,你可以添加一个 “切”:

nl. 

=>

nl, 
    !. 

/0谓词(切),告诉Prolog没有原路返回,试图找到其他的解决办法。在那里它会回溯到成员解释为什么prolog只返回一个选项,只有一个结果和false。

希望它有帮助。如果您遇到问题需要了解某些部分,请说出来,然后我将提供相关信息。

+0

非常有用的答案 - 谢谢!该程序正在工作,但我有2个查询: 首先,什么是“电话”?它看起来像一个内置函数,它将参数与列表名称相匹配,但对于任何语言来说,这似乎都是一件奇怪的事情。 其次,我的程序输出如下所示: “您的号码是25. Number = 25.” 因为他是不够的,所以我的老师简要地描述了一个似乎是Lisp-y想法的序言范式 - 返回最后一个评估值。这在Prolog中如何工作,以及如何告诉Prolog不要打印第二行? –

+0

对于调用部分,您可以参考swi-pl手册[此处](http://www.swi-prolog.org/pldoc/doc_for?object=call/2),它基本上是一个运行谓词保持的谓词通过你传给它的名字作为第一个参数,你将它作为第二个参数传递给它。调用被定义为从2到多达你想要的(在解释器模式中只有6个),所以基本上你可以调用它来处理在解释器模式下处理多达5个参数的谓词。对于第二部分,我不知道如何防止prolog争取他统一的尝试,但其他人可能比我更有见识:) – m09

1

我想你应该为房屋和颜色设置谓词/逻辑/事实,然后让prolog为你解决它,而不是在数组中创建lookup。