SWI-Prolog(SWISH):无权修改静态过程`(=)/ 2'

时间:2017-07-27 20:40:50

标签: prolog

在使用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中遇到过。我正在寻找一个更普遍,更“高级”的答案,我通过提出这个问题找到了答案。

1 个答案:

答案 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。我们没有对它做出定义。我们进行查询