你是非常接近!
剩下的一个问题是,你正在应用一个完全合理的逻辑推理来判断不承认这样的阅读。你的代码工作完全按照预期的,如果你简单地套用以下的极其直接的变化:中
- 代替
(\=)/2
,使用dif/2
- 代替
\+(isNonElement(X, Y))
,简单地写:member(X, Y)
。
第一次更改总是可取的:它通常会使您的程序在更多方向上可用。第二个改变通过使用纯谓词来避免使用不纯否定。
总体而言,我们现在有:
isNonElement(_, []).
isNonElement(X, [Y|Z]) :- dif(X, Y), isNonElement(X,Z).
delete(_, [], []).
delete(Y, [X|W], Z) :- member(X, Y), delete(Y, W, Z).
delete(Y, [X|W], [X|Z]) :- isNonElement(X, Y), delete(Y, W, Z).
现在检查了这一点:首先,你的测试案例:
?- delete([1], [1,2,3], X).
X = [2, 3] ;
false.
按预期工作!
其次,具有可变的情况下,为L2
:
?- delete([], L2, []).
L2 = [] ;
false.
这似乎也是很不错的。
三,另一个变量:
?- delete([X], [1,2,3], Ls3).
X = 1,
Ls3 = [2, 3] ;
X = 2,
Ls3 = [1, 3] ;
X = 3,
Ls3 = [1, 2] ;
Ls3 = [1, 2, 3],
dif(X, 3),
dif(X, 2),
dif(X, 1) ;
false.
注意现在X
不同的可能性,并dif/2
如何在回答用于表达X
必须从某个整数不同在这种情况下, 。
使用不纯谓词排除这样更通用的用法,并且您的评分系统也可以尝试这样的情况。
请注意,您当然可以轻松地自己实现member/2
。这是最直接的关系之一。然而,还要注意delete/3
是可怕的命名:一个势在必行总是意味着使用一个特定的方向,但我们正在考虑在这里的关系也承认许多其他用途 模式!
*减去任何*或减*所有*。你的例子只有一个元素,所以这是在一般情况下告诉你的后果。另外*不要*使用'delete'作为谓词名称。它已经被图书馆谓词所采用。使用更具体的东西。 – lurker