如果不是很熟悉Prolog,但我们正在使用编程语言作为另一种开发的非常未知的编程语言 . 我的问题如下 . 我很清楚我可以在Prolog查询中写的这个事实
([Head|Tail]) = ([a,b,c]).
这将导致我得到
Head = a, Tail = b,c.
但是,这不是我需要的 . 我正在写一个机器人,从程序中接收一个列表 . 该列表基本上是机器人必须走过的东西,并在程序中找到列表的每个元素,称之为环境 . 现在我的问题如下:
我似乎无法为如何获取该列表的第一个元素定义一些规则 . 我一直在尝试各种各样的事情 . 首先声明:
parameterList([a,b,c,d].
nextElement(X) :- parameterList(Z), member(Z,X).
似乎不起作用 . 为什么这不起作用?因为我也无法弄明白,所以我会事先提出下一个问题 . 从环境中我得到一个参数indexOfNextElement(B) . 这将返回我需要检索的列表中哪个元素的值 . 当然它从0开始,一旦这个由机器人交付,索引就会上升(这会自动进行) .
再一次,我对Prolog很新,所以我很有可能把所有的语法都弄错了,但是帮助我找到一种方法可能会很棒
1 回答
将参数放在member / 2
[a,b,c,d]
中的方式是列表Z
中的成员 . 因此,在查询时,您将获得由列表替换的变量X
:如果你翻转参数:
结果就是我想你想要的:
至于将元素放在第n个位置:这基本上是列表索引和该索引处元素之间的关系:
您可以查询这种不同的方式 . 哪些元素在哪个指数?:
哪个元素在索引1处?:
在哪个位置
c
?:通常,如果要对列表中的所有元素执行某些操作,可以遵循以下模式:
注意规则和递归目标中的
...
. 这是您放置关系的其他参数的位置(请参阅上面的list_nth_Element / 3) . 根据您要查询的内容,将相关参数保留为变量,Prolog将使用解决方案替换该变量,一次一个(参见上面的示例查询) .关于你的评论:上面的查询只是你如何使用list_nth_element / 3的一些例子 . 当然,您也可以将它用作机器人谓词中的目标:
在目标list_nth_element / 3之前的某个地方,您的谓词获取感兴趣的列表并将其绑定到变量,例如
L
. 列表可用后,您可以使用list_nth_element / 3和L
将元素放在所需位置 . 或者您可以使用上面的模式来编写谓词而不是list_nth_element / 3,它对列表的每个元素执行某些操作 .