如何只与列表中的非空尾结合?

时间:2017-05-02 00:00:39

标签: prolog

要与单个元素列表统一,请执行[_]。如何统一具有多个元素的列表?由于[_|_]仍将与[1]统一。

例如,我想知道是否可以与[1,2]统一,但不能与[1]统一。

我需要这个,因为我想使用delete(Lst1,[_|_] (if this worked), Lst2)来删除Lst1中的所有多元素列表。

现在要完成此操作,我必须首先从Lst1中删除所有单元素列表以获取包含所有多元素列表的列表,然后从Lst1中删除该列表以获取包含所有单元素列表的列表。

1 个答案:

答案 0 :(得分:4)

术语[_,_|_]与具有至少2个元素的列表统一起来:

   ?- [1]=[_,_|_].
no
   ?- [1,2]=[_,_|_].
yes
   ?- [1,2,3]=[_,_|_].
yes

关于您使用减法/ 3的计划,请考虑以下查询:

?- subtract([[1],[2,3],[4],[2,3]],[[_,_|_]], Lst2).
Lst2 = [[1], [4]].

这似乎是您想要做的,但如果[_,_|_][2,3]统一:

?- subtract([[1],[2,3],[4],[5,6]],[[_,_|_]], Lst2).
Lst2 = [[1], [4], [5, 6]].

你是否有机会尝试做this之类的事情?