我遇到了以下问题:
我想从头到尾逐个建立一个列表。但我有一个条件,这取决于已插入的元素。
condition(Sofar, Element) :-
between(1, 150, Element2),
\+member(Element2, Sofar),
Element = Element2.
makelist(L) :- maplist(condition(L), L).
一个重要说明:Sofar
不得包含NewElement
,我只是试图断言!这就是我所有尝试都失败的地方,因为使用maplist,列表中有一个引用,其值为NewElement
当然我有更复杂的条件,但如果我能解决这个问题,那么我就可以适应它了。
答案 0 :(得分:4)
您正在尝试将您在面向命令(a.k.a命令式)语言中学到的概念映射到Prolog。 Sofar
或makelist
等名称暗示您正在逐步执行某些操作。通过描述列表的外观,尝试从另一个角度看所有这些:
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).
或者,使用clpfd:
:- use_module(library(clpfd)).
specialfdlist(Es) :-
Es ins 1..150,
all_different(Es).