Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List Prolog-如何限制变量列表长度_List_Prolog_Prolog Dif_Meta Predicate - Fatal编程技术网

List Prolog-如何限制变量列表长度

List Prolog-如何限制变量列表长度,list,prolog,prolog-dif,meta-predicate,List,Prolog,Prolog Dif,Meta Predicate,我在生成符合特定条件的所有列表时遇到问题 city(new_york, 47). city(chicago, 100). all_unique([]). all_unique([H|T]) :- H = [] ; (not(member(H, T)), all_unique(T)). cities([Head|Tail]) :- length(Tail, L), L < 2, city(Head, _A), (Tail = [] ; cities(Tai

我在生成符合特定条件的所有列表时遇到问题

city(new_york, 47).
city(chicago, 100).

all_unique([]).
all_unique([H|T]) :- H = [] ; (not(member(H, T)), all_unique(T)).

cities([Head|Tail]) :-
    length(Tail, L),
    L < 2,
    city(Head, _A),
    (Tail = [] ; cities(Tail)).
?- cities(L).
L = [new_york] ;
L = [chicago] ;
L = [new_york, new_york] ;
L = [new_york, chicago] ;
L = [chicago, new_york] ;
L = [chicago, chicago] ;
ERROR: Out of global stack
?-

如何告诉Prolog不要尝试太长或重复项的列表?

您对
all\u unique/1
的定义更好地基于:

基于此,您可以这样定义
城市/1

city_(new_york, 47).
city_(chicago, 100).

city(C) :-
   city_(C, _).

cities(List) :-
   length(Ref, 2),
   append(List, _, Ref),
   all_unique(List),
   maplist(city, List).
示例查询:

?- cities(Xs).
Xs = [] ;
Xs = [new_york] ;
Xs = [chicago] ;
Xs = [new_york, chicago] ;
Xs = [chicago, new_york] ;
false.                                    % terminates universally

您对
all_unique/1
的定义基于:

基于此,您可以这样定义
城市/1

city_(new_york, 47).
city_(chicago, 100).

city(C) :-
   city_(C, _).

cities(List) :-
   length(Ref, 2),
   append(List, _, Ref),
   all_unique(List),
   maplist(city, List).
示例查询:

?- cities(Xs).
Xs = [] ;
Xs = [new_york] ;
Xs = [chicago] ;
Xs = [new_york, chicago] ;
Xs = [chicago, new_york] ;
false.                                    % terminates universally

cities(L):-findall(City,City(City,,,),L)
。谢谢,但我不能使用findall。没有findall有什么办法吗?
cities(L):-findall(City,City(City,,,),L)
。谢谢,但我不能用findall。有没有办法不用findall?是的对不起你的很好。它只是不适用于我所有的独特。我不知道为什么我的坏了。我不能使用地图列表或dif@JoshR. 你用的是哪个Prolog处理器?我用的是swi-prolog@JoshR. 好的,SWI既有
dif/2
又有
maplist/2
@capelical这整个“不能使用XYZ”进行编程练习是如此愚蠢,我正在努力寻找表达我对它的感受的词语。是的,对不起,你的很好。它只是不适用于我所有的独特。我不知道为什么我的坏了。我不能使用地图列表或dif@JoshR. 你用的是哪个Prolog处理器?我用的是swi-prolog@JoshR. 好吧,SWI既有
dif/2
又有
maplist/2
@capelical,整个编程练习中的“不能使用XYZ”是如此愚蠢,以至于我都在努力寻找词语来表达我对它的感受。