一些Prolog目标确定性成功的问题一次又一次地出现 - 至少 - 以下问题:
使用了不同的方法(例如,引发某些资源错误,或仔细查看Prolog toplevel给出的确切答案),但它们对我来说都有点不合适.
我正在寻找一种通用的,可移植的,符合ISO的方式来查明某些Prolog目标(成功)的执行是否会留下一些选择点.有些元谓词,也许?
你能否向我提示正确的方向?先感谢您!
我最近开始学习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的新手,并尝试了一些练习.其中之一是:
编写一个谓词集(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
给出了多个相同的解决方案.输入列表中的重复次数越多,解决方案就越多.我究竟做错了什么?提前致谢.
我需要编写一个程序来查找两个列表的交集.我不能使用剪切,结果列表中不应该有任何重复的元素.
这是我的代码:
intersection([],_,[]).
intersection([X|Xs],Y,[X|Zs]) :-
member(X,Y),
intersection(Xs,Y,Zs).
intersection([_|Xs],Y,Zs) :-
intersection(Xs,Y,Zs).
Run Code Online (Sandbox Code Playgroud)
当我运行以下查询时,我得到以下答案:
?- intersection([a,b,c,a],[a,v,c],L).
L = [a, c, a] ;
L = [a, c] ; % <---------- this is only answer I want to get
L = [a, a] ;
L = [a] ;
L = [c, a] ;
L = [c] ;
L = [a] ;
L = [].
Run Code Online (Sandbox Code Playgroud)
我能做什么?我想得到L = [a,c]
什么别的......你能帮忙吗?
union([H|T],[],[H|T]).
union([],[H|T],[H|T]).
union([H|T], SET2, RESULT) :- member(H,SET2), union(T,SET2,RESULT).
union([H|T], SET2, [H|RESULT]) :- not(member(H,SET2)), union(T,SET2,RESULT).
Run Code Online (Sandbox Code Playgroud)
我能够理解它是遍历第一个列表并根据元素是否是第二个列表的成员添加.我得到了逻辑.但是,工作流程对我来说是神秘的,它会在第一个列表耗尽后将"第二个列表"的元素添加到结果中.
请有人可以举一个简单的例子来union([1,2], [2,3], Result)
解释工作流程.