我编写了一个成员函数,以检查列表中是否存在元素。
member(X, [X|_]).
member(X, [_|Y]) :- member(X, Y).
我将.pl文件加载到SWI prolog中,我没有收到有关成员的警告或错误。我使用...
测试成员函数member(A, [1,2,3,4]).
这显然应该返回false。相反,我得到
A = 1
然后,当我尝试输入新命令时,ide只显示我键入的键,并显示未知操作“我按下了什么键”
我认为我的会员功能合理,因为它与我的教授写的一致。
有什么想法吗?
答案 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 ).