我在基本的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语句来检查我应该搜索哪种颜色,或者如何检查哪些数字在房子和颜色之间对应,甚至如何“返回”值!
在我看来,我错过了关键点或......思考语言的方式。
任何帮助将不胜感激。谢谢!
答案 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只返回一个只有一个结果而且是错误的选择。
希望它有所帮助。如果您在理解某些部分时遇到问题请说出来,我会给出信息。