带有列表和子列表的Prolog程序



嗨,我必须在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中也很重要......

最新更新