Prolog 是否在始终返回true时删除列表中的所有空格?

Prolog 是否在始终返回true时删除列表中的所有空格?,prolog,Prolog,此谓词删除列表中特定元素的出现 delMember(_, [], []). delMember(X, [X|Xs], Y) :- delMember(X, Xs, Y). delMember(X, [T|Xs], [T|Y]) :- dif(X, T), delMember(X, Xs, Y). 我从一个文件生成了一个列表,其中每一行都成为一个元素。但是,某些行可能是所有空格,应该删除。上面的谓词将删除一个只有一个空格的行,但是我需要添加两个特性。首先,我需要它删除所有

此谓词删除列表中特定元素的出现

delMember(_, [], []).
delMember(X, [X|Xs], Y) :-
    delMember(X, Xs, Y).
delMember(X, [T|Xs], [T|Y]) :-
    dif(X, T),
    delMember(X, Xs, Y).

我从一个文件生成了一个列表,其中每一行都成为一个元素。但是,某些行可能是所有空格,应该删除。上面的谓词将删除一个只有一个空格的行,但是我需要添加两个特性。首先,我需要它删除所有空间的元素,而不仅仅是那些只有一个空间的元素。其次,如果它没有找到所有空格的元素,我仍然需要它原封不动地返回列表。

创建一个谓词来验证原子是否仅由空格组成:

spaces(Atom) :-
    atom_chars(Atom, Chars),
    forall(member(Char, Chars), Char == ' ').
del_spaces([], []).
del_spaces([X|Xs], R) :-
    (   spaces(X)
    ->  del_spaces(Xs, R)
    ;   R = [X|Ys],
        del_spaces(Xs, Ys) ).
例如:

?- spaces('  a      ').
false.

?- spaces('      ').
true.

?- spaces(' ').
true.
然后,使用该谓词仅过滤不由空格组成的原子:

spaces(Atom) :-
    atom_chars(Atom, Chars),
    forall(member(Char, Chars), Char == ' ').
del_spaces([], []).
del_spaces([X|Xs], R) :-
    (   spaces(X)
    ->  del_spaces(Xs, R)
    ;   R = [X|Ys],
        del_spaces(Xs, Ys) ).
示例:

?- del_spaces([' ', one, 't w o', '   ', three], L).
L = [one, 't w o', three].

?- del_spaces([one, 't w o', three], L).
L = [one, 't w o', three].

那个谓词是不可靠的。它将删除与delMember/3的第一个参数相统一的任何元素(不仅是那些具有1个空格的元素,并且在列表中向下时保持统一),并乐观地保留在调用dif/2时无法确定它们与delMember/3的第一个参数“结构相等”的元素。带dif/2的条款排在最后。这一切看起来有点不对劲。