首页 > 解决方案 > 为什么否定作为失败适用于 \+ is_list 但不适用于 \+ is_flat?

问题描述

flattenList(L,FL) :-
   must_be(list,L),       % if L is unbound, the predicate does not terminate; make sure it's a list
   flattenList(L,[],FL).

% ===
% flattenList(+In, +Suffix, +Flattened)
%
% "'Flattened' is the flattened 'In' (which is [In] if 'In' is not a list),
% with the list 'Suffix' suffixed.
% ===

flattenList([],Suf,Suf).

flattenList([H|T],Suf,Flat):- 
   flattenList(T,Suf,LargerSuf),
   flattenList(H,LargerSuf,Flat).

flattenList(H,Suf,[H|Suf]):- \+ is_list(H).  % use NAF 

这个版本可以正常工作,但我想知道为什么如果我在不同的谓词名称上使用否定,比如

flattenList(H,Suf,[H|Suf]):- \+ is_flat_list(H).

不起作用。任何有关此的信息将不胜感激。

标签: prolog

解决方案


推荐阅读