建立一个列表,但要注意以前的元素

时间:2017-11-14 14:47:58

标签: list prolog

我遇到了以下问题:

我想从头到尾逐个建立一个列表。但我有一个条件,这取决于已插入的元素。

condition(Sofar, Element) :-     
    between(1, 150, Element2),  
    \+member(Element2, Sofar),
    Element = Element2.

makelist(L) :- maplist(condition(L), L).

一个重要说明:Sofar不得包含NewElement,我只是试图断言!这就是我所有尝试都失败的地方,因为使用maplist,列表中有一个引用,其值为NewElement

当然我有更复杂的条件,但如果我能解决这个问题,那么我就可以适应它了。

1 个答案:

答案 0 :(得分:4)

您正在尝试将您在面向命令(a.k.a命令式)语言中学到的概念映射到Prolog。 Sofarmakelist等名称暗示您正在逐步执行某些操作。通过描述列表的外观,尝试从另一个角度看所有这些:

  

1到150之间的元素列表,它们都是不同的。

all_dif([]).
all_dif([E|Es]) :-
   maplist(dif(E), Es),
   all_dif(Es).

speciallist(Es) :-
   all_dif(Es),
   maplist(between(1,150), Es).

或者,使用

:- use_module(library(clpfd)).

specialfdlist(Es) :-
   Es ins 1..150,
   all_different(Es).