嗨,我必须在Prolog中解决一个问题,听起来像这样:删除列表中所有正在增加的子列表。例如,列表 [1,[2],[3,4],6] 变为 [1,6]。到目前为止,我已经尝试过这个,但它不起作用。请帮忙吗?
domains
el=integer
list=el*
element=integer;list
lista=element*
goal
elim([1,[2],[3],4)],L),
write(L).
predicates
elim(lista,lista)
is_increasing(lista)
is_list(lista)
clauses
is_increasing([A,B|T]) :-
B>A,
is_increasing([B|T]).
is_list([_|_]).
is_list([]).
elim([],[]).
elim([E|Es],[E|Ts]) :-
is_list(E),
is_increasing(E),
elim(Es, Ts).
尝试模块化你的代码:首先写一个is_increasing/1。由于 1 个元素的列表似乎正在增加,因此您可以简单地执行以下操作:
is_increasing([A,B|T]) :- B > A, is_increasing([B|T]).
is_increasing([_]).
然后,您可以使用它在复制时丢弃元素。在调用之前,请注意检查元素是否为列表。这是一个可能的定义
is_list([_|_]).
is_list([]).
编辑
有一个错误的声明,正如Mbratch所建议的那样
element=i(integer);l(list)
应该是
element=integer;list
另外,你忘记了is_increasing([_]).
,反正你根本没有使用is_list或is_increasing。
删除子列表的规则当然应改为
elim([E|Es], Ts) :- is_list(E), is_increasing(E), elim(Es, Ts).
只需添加基本大小写和一个副本,即 elim 是一个 3 个子句谓词...
编辑上面的规则,你只需要一个基本情况
elim([],[]).
和一份副本
elim([E|Es],[E|Ts]) :- elim(Es, Ts).
试着理解为什么规则的顺序在Prolog中也很重要......