相关疑难解决方法(0)

Prolog:过滤清单?

我目前正在开发一个关于Prolog的非常短的项目,并且试图将我创建的"过滤器"应用到列表中.我有你可以称之为过滤器的东西,但我无法应用它.如果我说明一下会更好:

filter(A, B) 
Run Code Online (Sandbox Code Playgroud)

...如果满足某些条件,则输出'true'.

filterList(A, [X, Y, Z])
Run Code Online (Sandbox Code Playgroud)

...输出一个列表,其中包含第二个参数中使过滤器输出为false的所有元素.(因此,如果过滤器(A,X)为真,则输出为[Y,Z]).

我已准备好"过滤器"功能,但现在我需要将它应用于第二个示例中所示的列表,排除在应用第一个参数时过滤器返回true的所有元素.

因此,如果过滤器是简单的A == B,则该函数应该接收A [A,B,A,C,D,A]并输出[B,C,D],删除了所有元素显然,过滤器适用.

我在功能的基本结构方面遇到了麻烦,所以如果有人能为这样的功能提供一个基本的轮廓,那将会有很大的帮助.我尽可能地简化了我的情况,所以我可以拿出你能提供的任何东西,并根据我的需要进行修改.

提前致谢!

list prolog filter meta-predicate

16
推荐指数
2
解决办法
1万
查看次数

删除列表中的重复项(Prolog)

我是Prolog的新手,并尝试了一些练习.其中之一是:

编写一个谓词集(InList,OutList),它将任意列表作为输入,并返回一个列表,其中输入列表的每个元素只出现一次.

这是我的解决方案:

member(X,[X|_]).
member(X,[_|T]) :- member(X,T).

set([],[]).
set([H|T],[H|Out]) :-
    not(member(H,T)),
    set(T,Out).
set([H|T],Out) :-
    member(H,T),
    set(T,Out).
Run Code Online (Sandbox Code Playgroud)

我不允许使用任何内置谓词(即使不使用也会更好not/1).问题是,这set/2给出了多个相同的解决方案.输入列表中的重复次数越多,解决方案就越多.我究竟做错了什么?提前致谢.

list prolog

15
推荐指数
4
解决办法
4万
查看次数

计算列表中数字的出现次数

我正在prolog中编写一个程序来计算列表中数字的出现次数

count([],X,0).
count([X|T],X,Y):- count(T,X,Z), Y is 1+Z.
count([_|T],X,Z):- count(T,X,Z).
Run Code Online (Sandbox Code Playgroud)

这是输出

?- count([2,23,3,45,23,44,-20],X,Y).
X = 2,
Y = 1 ;
X = 23,
Y = 2 ;
X = 23,
Y = 1 ;
X = 3,
Y = 1 ;
X = 45,
Y = 1 ;
X = 23,
Y = 1 ;
X = 44,
Y = 1 ;
X = -20,
Y = 1 ;
false.
Run Code Online (Sandbox Code Playgroud)

它数次数相同

任何帮助表示赞赏

list prolog

12
推荐指数
1
解决办法
2万
查看次数

使用带有`length/2`的约束变量

这是问题所在:

$ swipl
Welcome to SWI-Prolog (Multi-threaded, 64 bits, Version 7.3.6-5-g5aeabd5)
Copyright (c) 1990-2015 University of Amsterdam, VU Amsterdam
SWI-Prolog comes with ABSOLUTELY NO WARRANTY. This is free software,
and you are welcome to redistribute it under certain conditions.
Please visit http://www.swi-prolog.org for details.

For help, use ?- help(Topic). or ?- apropos(Word).

?- use_module(library(clpfd)).
true.

?- N in 1..3, length(L, N).
N = 1,
L = [_G1580] ;
N = 2,
L = [_G1580, _G1583] ;
N = 3,
L …
Run Code Online (Sandbox Code Playgroud)

prolog clpfd

10
推荐指数
1
解决办法
535
查看次数

谓词选择列表中的元素两次而不是更多

我试图写一个谓词twice(El,L)将返回true.El是名单正是两次.这是我有的:

twice(El,L) :- select(El,L,L1), member(El,L1), \+ twice(El,L1).
Run Code Online (Sandbox Code Playgroud)

它的效果很好twice(2,[1,2,2,3,4]) 但是twice(X,[1,1,2,2,3,3])它为每个数字加倍X = 1 ; X = 1 ; X = 2...我怎么能避免这种情况而不使用任何累加器呢?

prolog

7
推荐指数
1
解决办法
858
查看次数

(SWI)Prolog:次级目标的顺序

我在Prolog中有两个稍微不同的谓词unique_element/2实现.当给定元素X和列表L时,谓词成功,元素X在列表中仅出现一次.以下是实现和结果:

实施1:

%%% unique_element/2
unique_element(Elem, [Elem|T]) :-
    not(member(Elem, T)). 
unique_element(Elem, [H|T]) :-
    member(Elem, T), 
    H\==Elem, 
    unique_element(Elem, T), 
    !. 
Run Code Online (Sandbox Code Playgroud)

结果:

?- unique_element(X, [a, a, b, c, c, b]). 
false.

?- unique_element(X, [a, b, c, c, b, d]).
X = a ;
X = d.
Run Code Online (Sandbox Code Playgroud)

实施2:

%%% unique_element/2
unique_element(Elem, [Elem|T]) :- 
    not(member(Elem, T)). 
unique_element(Elem, [H|T]) :-
    H\==Elem, 
    member(Elem, T), 
    unique_element(Elem, T), 
    !. 
Run Code Online (Sandbox Code Playgroud)

如果你没有第一眼就注意到:"H\== Elem"和"成员(Elem,T)"在第二个impl,规则2上被翻转.

结果:

?- unique_element(X, [a, a, b, c, c, b]).
X = a.

?- unique_element(X, [a, b, c, c, …
Run Code Online (Sandbox Code Playgroud)

prolog

5
推荐指数
4
解决办法
292
查看次数

Prolog计数列表元素高于n

我是Prolog的新手,所以我在某项任务中遇到了一些问题.任务是编写尾递归谓词count_elems(List,N,Count)条件List_Element > N, Count1 is Count+1.

我的方法:

count_elems( L, N, Count ) :-
   count_elems(L,N,0).
count_elems( [H|T], N, Count ) :-
   H > N ,
   Count1 is Count+1 ,
   count_elems(T,N,Count1).
count_elems( [H|T], N, Count ) :-
   count_elems(T,N,Count).
Run Code Online (Sandbox Code Playgroud)

错误信息:

ERROR: toplevel: Undefined procedure: count_elems/3 (DWIM could not correct goal)
Run Code Online (Sandbox Code Playgroud)

我不太清楚问题出在哪里.thx任何帮助:)

prolog

3
推荐指数
1
解决办法
2141
查看次数

计算Prolog中列表中出现的次数

我在Prolog中编写了这个小代码,用于计算列表中某些术语的出现次数.它工作,但它不是尾递归(所以没有递归优化).

我怎么能用尾递归编写相同的程序?

counter(T,[],X) :- 
   X is 0.
counter(T,[T|D],X1) :-
   !,
   counter(T,D,X),
   X1 is X+1.
counter(T,[_|D],X1) :-
   counter(T,D,X1).
Run Code Online (Sandbox Code Playgroud)

我认为我应该使用累加器,但我不知道如何实现.有帮助吗?

tail-recursion prolog

3
推荐指数
1
解决办法
1248
查看次数

标签 统计

prolog ×8

list ×3

clpfd ×1

filter ×1

meta-predicate ×1

tail-recursion ×1