所以,我正在尝试删除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).
首先,当您加载程序时,您对变量Y
,Result
和ThowAway
收到了一两个警告。在运行程序之前,应删除此类警告。
您的混凝土查询是
?- mydelete_all([a,b,c,d],a,Result).
TopLevel Swi-Prolog向您展示了一个随机命名的变量。实际上,在您的Swi-Prolog版本中,您已经猜到了内存位置或多或少。SWI的较新版本改为显示不可再生的数字 - 没有G
。
其他系统提供了更可读的名称,例如sicstus或gnu。
那么这个答案是什么
Result = [b,c,d|_A]
实际上是指吗?它包括以b
,c
,d
开头的所有列表。因此,[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)
。然后是最后一个规则!