成员函数给出奇怪的结果。

时间:2017-04-14 23:43:19

标签: recursion prolog

我编写了一个成员函数,以检查列表中是否存在元素。

member(X, [X|_]).
member(X, [_|Y]) :- member(X, Y).

我将.pl文件加载到SWI prolog中,我没有收到有关成员的警告或错误。我使用...

测试成员函数
member(A, [1,2,3,4]).

这显然应该返回false。相反,我得到

 A = 1

然后,当我尝试输入新命令时,ide只显示我键入的键,并显示未知操作“我按下了什么键”

我认为我的会员功能合理,因为它与我的教授写的一致。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

您已在 i / o模式(o,i) e.i中调用谓词member/2。第一个参数 free(未绑定)变量,第二个参数是绑定变量。

在该模式下(尽管它的名称)member/2实际上不会针对列表成员资格测试元素,而只是逐个枚举列表元素,最后,当没有剩余元素时,它会失败(谓词< 逻辑编程方面的强>失败,而不是返回错误)。

此谓词通常用于所谓的故障驱动控制技术,例如:

简单编写枚举列表元素时的简单示例

 ?- forall( member(X, [1,2,3,4]), write( X ) ).

注意,在这种情况下,列表用完后不会失败。 为了确保这一点,添加了最后一个子句,这意味着“谓词成功了”。

 p( List, Action ) :- generator( Variant, List ), side_effect_action( Variant ), fail.
 p( _ , _ ).

 generator( X, L ) :- member( X, L ).