在Prolog中使用2D数组

时间:2011-11-26 05:29:07

标签: prolog

我在基本的Prolog中寻求帮助,这种语言的范式很难让我掌握。我对其他语言(C ++,Lisp,Java,汇编等)非常熟悉,但对Prolog来说是一个完整的新手。

需要解决的问题 - 基本英语:给定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语句来检查我应该搜索哪种颜色,或者如何检查哪些数字在房子和颜色之间对应,甚至如何“返回”值!

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

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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

在prolog规范中,注意到这些参数 - 参数,但是已经记录了绑定参数+注意参数和可以绑定和自由的参数?参数。所以在这里,您可以发表评论,例如:

% 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),

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

    call(House, Pool2),

与houseA和Pool2相同。

    member(Result, Pool1),

现在我们告诉prolog我们希望我们的Result成为Pool1的成员

    member(Result, Pool2),

Pool2的成员。

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

最后我们显示消息。

Prolog将结果显示为R = x;假如下,如果你不想要;假部分,你可以添加一个“剪切”:

    nl.

=&GT;

    nl,
    !.

!/ 0 谓词(cut)告诉prolog不要回溯试图找到其他解决方案。在那里,它会对成员进行回溯,解释为什么prolog只返回一个只有一个结果而且是错误的选择。

希望它有所帮助。如果您在理解某些部分时遇到问题请说出来,我会给出信息。