我最近开始学习Prolog,我无法解决如何组合三个列表的问题.
我能够组合2个列表:
%element
element(X,[X|_]).
element(X,[_|Y]):-
element(X,Y).
%union
union([],M,M).
union([X|Y],L,S) :- element(X,L),union(Y,L,S).
union([X|Y],L,[X|S]) :- (not(element(X,L))),union(Y,L,S).
Run Code Online (Sandbox Code Playgroud)
有人可以帮我吗?
我正试图用Prolog解决一个新程序,我被卡住了,不知道如何继续...我必须做一个有3个参数的谓词,第一个是元素列表,第二个是是元组列表,如果元组的第一个元素与第一个参数列表的元素匹配,则第三个必须是返回的包含元组的第二个元素的列表.它也必须删除副本!!
例如,
check([a,c],[(a,aa),(bb,bbb),(a,aa),(c,def)],X).
X = [aa, def] .
Run Code Online (Sandbox Code Playgroud)
如您所见,a和c匹配元组列表,因此返回元组的第二个元素.
所以它可以工作,但如果有多个元组包含第一个匹配的第一个元素,它只需要一次,例如:
check([a,b],[(a,c),(a,d),(b,c),(b,e),(c,f)],X).
X = [c] .
Run Code Online (Sandbox Code Playgroud)
它第一次找到并且第一次取c和b,再次取c,但不迭代找到更多的a或b,正确的结果应该是X = [c,d,e].
所以,请问您如何解决这种情况或解决问题的任何线索......
这是我的代码:
check([],_,[]).
check(L,DIC,Xord) :- inter(L,DIC,X), list_to_set(X,Xord).
inter([],_,[]).
inter(L1, DIC, L3) :-
L1 = [H|T],
DIC = [(DIC1,DIC2)|_],
H == DIC1,
L3 = [DIC2|L3T],
inter(T, DIC, L3T).
inter(L1,[_|DIC],L3) :- inter(L1,DIC,L3).
inter([_|T], DIC, L3) :- inter(T, DIC, L3).
Run Code Online (Sandbox Code Playgroud)
在此先感谢您的时间.
我想编写一个函数,通过删除小于或等于特定数字的所有内容来过滤数字列表.该功能将采用两个参数:数字列表和要过滤的数字.该函数应返回一个列表,其中所有数字都大于过滤器编号.
有时这样:
filter_num_list(L1,N,L2) :- ...
test_filter_num_list :- filter_num_list([1,2,3,4,5,6,7,8,9],5,[5,6,7,8,9]).
Run Code Online (Sandbox Code Playgroud) 我正在尝试查看列表并计算给定单词出现的次数.到目前为止我有这个:
count_repetitions([_], [], 0).
count_repetitions([Word], [Word|Tail], Count):-
count_repetitions([Word], Tail, X),
Count is X + 1.
count_repetitions([Word], [Z|Tail], Count):-
Word \= Z,
count_repetitions([Word], Tail, Count).
Run Code Online (Sandbox Code Playgroud)
所以查询?- count_repetitions([yes],[yes,and,yes,and,no], X).会给出X = 2.
这似乎有效.现在我需要编写一个谓词,在表单中输出一个包含搜索词及其出现次数的列表X = [(yes - 2)].我完全陷入困境,有什么建议吗?
您好,我希望对此任务有一些建议或意见:
定义一个带有三个参数的语句,其中第一个是列表,第二个是元素(原子或列表),最后一个是必须完成它的列表等于第一个匹配第二个参数的列表元素,消失了.
Examples:
> elimina([f, e, d, [a, h], a, d, a], a, L)
L = [f, e, d, [a, h], d]
> elimina([f, e, d, [ a, h], a, [d, a]], [a, h], L)
L = [f, e, d, a, [d, a]]
Run Code Online (Sandbox Code Playgroud)
我试过了:
elimina([],_,[]).
elimina([X],X,[]).
elimina([X],Y,[X]).
elimina([H|T],H,Result) :-
elimina([T],H,Result).
elimina([H|T],Y,Result):-
elimina([T],H,Result).
Run Code Online (Sandbox Code Playgroud)
当我喊出递归调用时,我怀疑要写什么:
elimina([T],H,Result).
Run Code Online (Sandbox Code Playgroud)
因为首先我不知道输入第二个元素与头部匹配时的行为应该有多么不同,而不是与头部匹配; 所以我打了同样的电话.我也怀疑因为:真的需要把基础案例:elimina([X],Y,[X]).?我认为我们可以通过将要删除的元素与真正进入列表的元素进行匹配来传递练习.
感谢您的时间.
我想写谓词,它可以计算所有遇到的数字:
count(1, [1,0,0,1,0], X).
X = 2.
Run Code Online (Sandbox Code Playgroud)
我试着把它写成:
count(_, [], 0).
count(Num, [H|T], X) :- count(Num, T, X1), Num = H, X is X1 + 1.
Run Code Online (Sandbox Code Playgroud)
为什么不工作呢?
我正在尝试在Prolog(SWI Prolog)中创建一个列表,并检查哪些数字是2的幂,然后查找列表中特定数字的次数(在此示例中,我试图查找该数字的次数)列表中有3个).举个例子,如果你问
?- check([0,2,3,-5,-2,1,8,7,4], MULT2, THREE).
Run Code Online (Sandbox Code Playgroud)
你应该看到
MULT2=[2,8,4]
THREE=1
Run Code Online (Sandbox Code Playgroud)
我第一次尝试找到一个解决方案是用头部搜索列表并执行头部mod 2 = 0来查找所有2次幂的数字,但是出了点问题我只得到"假"作为答案.
我需要创建一个名为fAtomPairs的谓词,以便给定一个原子(第一个参数)和一对对列表(每个对依次是两个原子的列表),通过仅选择那些对,将第三个参数与已过滤的对的列表统一起来具有作为第一个组成部分的原子是第一个参数.
例如 :
fAtomPairs(sA,[[basA,absAb],[ab,bbsA],[sA,abbsB],[bsA,sAsB],[sA,bb]],X)
Run Code Online (Sandbox Code Playgroud)
必须导致
X = [[sA,abbsB],[sA,bb]]
Run Code Online (Sandbox Code Playgroud)
我怎么能这样做?我目前正在SWISH工作