我目前正在开发一个关于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],删除了所有元素显然,过滤器适用.
我在功能的基本结构方面遇到了麻烦,所以如果有人能为这样的功能提供一个基本的轮廓,那将会有很大的帮助.我尽可能地简化了我的情况,所以我可以拿出你能提供的任何东西,并根据我的需要进行修改.
提前致谢!
我是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给出了多个相同的解决方案.输入列表中的重复次数越多,解决方案就越多.我究竟做错了什么?提前致谢.
我正在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)
它数次数相同
任何帮助表示赞赏
这是问题所在:
$ 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) 我试图写一个谓词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中有两个稍微不同的谓词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的新手,所以我在某项任务中遇到了一些问题.任务是编写尾递归谓词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中编写了这个小代码,用于计算列表中某些术语的出现次数.它工作,但它不是尾递归(所以没有递归优化).
我怎么能用尾递归编写相同的程序?
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)
我认为我应该使用累加器,但我不知道如何实现.有帮助吗?