为什么我的delete_all方法返回prolog中带有随机内存位置的列表



所以,我正在尝试删除y为a的所有元素。它似乎有效,但是我遇到的问题是它正在返回错误的事情。这是我返回的结果。

Result = [b, c, d|_G1355]

这是我到目前为止的代码。

mydelete_all([],Y,Result).
mydelete_all([X|T], Y, [X|Result]):-
       X = Y,
       mydelete_all(T, Y, Result).
mydelete_all([ThowAway|Tail], Y, Result):-
       mydelete_all(Tail, Y, Result).

首先,当您加载程序时,您对变量YResultThowAway收到了一两个警告。在运行程序之前,应删除此类警告。

您的混凝土查询是

?- mydelete_all([a,b,c,d],a,Result).

TopLevel Swi-Prolog向您展示了一个随机命名的变量。实际上,在您的Swi-Prolog版本中,您已经猜到了内存位置或多或少。SWI的较新版本改为显示不可再生的数字 - 没有G

其他系统提供了更可读的名称,例如sicstus或gnu。

那么这个答案是什么

Result = [b,c,d|_A]

实际上是指吗?它包括以bcd开头的所有列表。因此,[b,c,d],但[b,c,d,a]也是解决方案。您不是要删除a的所有出现,现在Result的解决方案之一再次包含a

但是情况更糟。类型;获取进一步的解决方案:

?- mydelete_all([a,b,c,d],a,Result).
   Result = [b,c,d|_A]
;  Result = [b,c|_A]
;  Result = [b,d|_A]
;  Result = [b|_A]
;  Result = [c,d|_A]
;  Result = [c|_A]
;  Result = [d|_A]
;  false.

更糟:

?- mydelete_all([a],a,[a]).
   true.
?- mydelete_all([],a,[a]).
   true.

最后一个查询只能使用您的事实。因此,这个事实太笼统了。另一个错误是X = Y将其替换为dif(X, Y)。然后是最后一个规则!

相关内容

  • 没有找到相关文章

最新更新