在使用SWI-Prolog(SWISH)中的不同列表谓词进行游戏时,我试图检查原子a
是否是我在程序中定义为List1
的列表List1 = [a,b,c,d]
的一部分{1}}。
我将我的查询描述为member(a, List1).
,期待一些简单的“是”(正如它在youtube video中显示的那样,在59:25),但我收到了警告< / p>
单例变量:[List1]
和错误
无权修改静态过程`(=)/ 2'
据我所知,从网上查看,这里的警告并不重要。但是,我不明白为什么在a
显然是List1
的成员时收到错误消息。
我尝试了两种不同的方法:
1)将List1 = [a,b,c,d].
添加到程序并使用member(a,List1).
查询(导致上述错误);
2)将List1 = [a,b,c,d]
直接传递给解释器,然后使用相同的查询(member(a,List1).
),这会产生无穷无尽的结果,其中a
在头部中移位列表,如下:
List1 = [a|_1186]
List1 = [_1062, a|_1070]
List1 = [_1062, _1068, a|_1076]
List1 = [_1062, _1068, _1074, a|_1082]
List1 = [_1062, _1068, _1074, _1080, a|_1088]
这是关于我正在使用的特定Prolog版本的内容,还是我错过了一些非常简单的内容?
修改
我知道有一个类似的问题提出here,但我没有完全理解答案(也不是问题),因为它立即以dynamic
的方式进行,我没有但是在Prolog中遇到过。我正在寻找一个更普遍,更“高级”的答案,我通过提出这个问题找到了答案。
答案 0 :(得分:1)
我在程序中定义为
List1 = [a,b,c,d].
这不是它的作用。它的作用是定义谓词=/2
:
2 ?- write_canonical( (List1 = [a,b,c,d]) ). =(_,[a,b,c,d])
(您在那里看到的 ?-
或 2 ?-
是交互式提示一个Prolog系统;在我的情况下是SWI Prolog。无论在我输入的内容之后是哪一行;然后在下一行我们看到系统的响应。
当然,这会将=
作为统一谓词的现有内置定义践踏。因此错误就是这样说的。是的, 非常重要。
要在Prolog中“定义”列表,我们可以定义谓词
8 ?- [user].
p([1,2,3,4]).
这样我们就可以查询
9 ?- p(List1).
List1 = [1, 2, 3, 4].
并与List1
,
10 ?- p(List1), member(A,List1).
List1 = [1, 2, 3, 4],
A = 1 ;
List1 = [1, 2, 3, 4],
A = 2 ;
List1 = [1, 2, 3, 4],
A = 3 ;
List1 = [1, 2, 3, 4],
A = 4.
我们也可以直接将列表指定为查询的子目标,
11 ?- List1 = [1,2,3,4], member(A,List1).
List1 = [1, 2, 3, 4],
A = 1 ;
List1 = [1, 2, 3, 4],
A = 2 ;
List1 = [1, 2, 3, 4],
A = 3 ;
List1 = [1, 2, 3, 4],
A = 4.
使用使用谓词=/2
,而不是重新定义, 禁止
以上回答了您的1)
。至于2)
,你并没有告诉我们全部真相。你似乎已经做了什么,首先是进行查询
12 ?- List1 = [a,b,c,d].
List1 = [a, b, c, d].
这很好,花花公子;和然后使另一个查询,
13 ?- member(a,List1).
List1 = [a|_G2181] ;
List1 = [_G2180, a|_G2184] ;
List1 = [_G2180, _G2183, a|_G2187] ;
List1 = [_G2180, _G2183, _G2186, a|_G2190] ;
List1 = [_G2180, _G2183, _G2186, _G2189, a|_G2193] .
Prolog提示不是REPL。我们没有对它做出定义。我们进行查询。