0

嗨,我必须在 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).  
4

1 回答 1

0

尝试模块化你的代码:首先编写一个 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 中也很重要......

于 2013-11-08T17:04:41.570 回答