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

带有列表和子列表的Prolog程序,prolog,turbo-prolog,Prolog,Turbo 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_increasin

嗨,我必须解决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_/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
另外,您忘记了
正在增加([[uu])。
,而且您根本没有使用的是列表或正在增加

当然,删除子列表的规则应该是

elim([E|Es], Ts) :- is_list(E), is_increasing(E), elim(Es, Ts).
只需添加基本案例和副本。i、 elim是一个三分句谓词

除了上面的规则,您只需要一个基本案例

elim([],[]).
还有一份

elim([E|Es],[E|Ts]) :- elim(Es, Ts).

只要试着理解为什么规则的顺序在Prolog中也很重要……

您可能想提及您正在使用的Prolog解释器(PDC Visual Prolog?)。首先,看起来元素的形式必须是
i()
l()
,但您的元素只是整数和整数列表。按照代码的编写方式,它需要一个类似于,
[i(1)、l([i(2)]、l([i(3)]、i(4)]之类的列表。但是它会尝试匹配一个子列表,比如
l([i(2)]
和不匹配的
[…]
。我在使用Turbo Prolog我应该如何将代码放入程序中?很抱歉,我不熟悉prolog,但我不了解它。在
谓词
部分声明它们(您已经知道如何声明参数是一个列表),将该代码添加到
子句
部分,然后简化您的elim,在
是列表(E)时避免复制元素
我已经更新了问题,并将新的条款放在那里。仍然不起作用,现在它说元素没有被声明..你说elim是3子句谓词是什么意思?我只有伊琳(莉斯塔,莉斯塔)两个。我也尝试更改代码,我不知道是否可以放弃,我没有其他想法:(