我的任务是编写通过两个列表读取的代码部分,并找到两个列表之间的路径。
但是,如果我在第一个列表中找到所需的节点,那么我的问题就是读取并返回一个TRUE大小写。我一直在编写如下代码。
%declare the list
circle_line([cc1,cc2,cc3,cc4,cc5,cc6,cc7,cc8,cc9,cc10,cc11,cc12,cc13,cc14,cc15,cc16]).
%the predicate that finds the station i need
check_for_station(A) :- circle_line(X),
member(A,X),
write(A),nl.
然后在cosole我输入:check_for_station(cc9)
。
但我得到的答案是“不”。 我有一种感觉,我正在声明列表错误,因为在调试器中X的值出现“H135”或其他东西,它显然不会循环遍历每个元素以找到我需要的那个。
答案 0 :(得分:0)
为什么他们发现,在Amzi! Prolog经典(和非确定性)成员/ 2 谓词不是“内置”,而是提供(以及其他有用的列表操作谓词,如 length / 2 )in list library。有关列表的内置与库谓词的一些上下文,请参阅here。
如果 check_for_station / 1 仅在其参数A
绑定的情况下被调用(如示例所示),那么Amzi!的内置(和确定性)谓词 is_member / 2 将完成工作(并且更快一点)。
这种想法似乎是不确定的成员/ 2 是一个双行用户定义,并提供更快的确定性版本(不允许回溯列表成员)是用户可以做的事情不容易为自己提供。