如何在prolog中浏览数据库
我有一个数据库,由一种疾病的症状和这些症状所属的疾病组成,如下所示如何在prolog中浏览数据库,prolog,Prolog,我有一个数据库,由一种疾病的症状和这些症状所属的疾病组成,如下所示 disease([dordecabeca,febre,dormuscular,dorgarganta,cansaco],gripe). disease([febre,dordecabeca,dorolhos,manchas,nauseas],dengue). disease([febre,coceira,dordecabeca,dordebarriga,perdadeapetite],catapora). disease([fe
disease([dordecabeca,febre,dormuscular,dorgarganta,cansaco],gripe).
disease([febre,dordecabeca,dorolhos,manchas,nauseas],dengue).
disease([febre,coceira,dordecabeca,dordebarriga,perdadeapetite],catapora).
disease([febre,dordecabeca,fadiga,perdadeapetite,inchacorosto],caxumba).
disease([congestaonasal,gargantairritada,espirros,febre,tosse],resfriado).
treatment([evitarmedicamentosdeaspirina,respouso],dengue).
treatment([evitarmedicamentosdeaspirina,repouso,paracetamol],dengue).
treatment([repouso,evitarpessoas,semmedicamento],catapora).
treatment([repouso,evitarpessoas,medicamento],catapora).
treatment([repouso,evitarpessoas],caxumba).
treatment([repouso,boaalimentacao],gripe).
treatment([repouso,boalimentacao,medicamentos],gripe).
treatment([repouso,boaalimentacao,semmedicamentos],refriado).
treatment([repouso,boaalimentacao,medicamento],resfriado).
symptoms(L1,X):-disease(L1,X).
treatdisease(L1,L2,Y):-symptoms(L1,Y),treatment(L2,Y).
通过symptons谓词,我可以可视化所有症状和相应的疾病。对于predicate treatdisease,我可以看到基于两个基础共同疾病的治疗
symptoms(L1,X):-disease(L1,X).
treatdisease(L1,L2,Y):-symptoms(L1,Y),treatment(L2,Y).
但是,如果我像我一样将一个条目列表与潜在的疾病进行比较,会怎么样呢?
如果它只是一个列表,我已经有了谓词,但是在多维的基础上,我不知道如何去做
例如,如果我带着:
?searchdisease([dordecabeca,febre,dormuscular,dorgarganta],Disease).
如何在数据库中使用此列表来查看数据库
所以我用谓词来提取两个列表之间的不同元素,用谓词来获取两个列表之间的相等元素,但是当列表位于子集中时,我不知道如何使用它们。遵循谓词
%---------------------------------------------------------
%Predicate to pick up equal elements between two lists.
equalelements([],[]).
equalelements([X|Xs0],Ys0) :-
tpartition(=(X),Xs0,Es,Xs),
if_(Es=[], Ys0=Ys, Ys0=[X|Ys]),
equalelements(Xs,Ys).
tpartition(P_2,List,Ts,Fs) :-
tpartition_ts_fs_(List,Ts,Fs,P_2).
tpartition_ts_fs_([],[],[],_).
tpartition_ts_fs_([X|Xs0],Ts,Fs,P_2) :-
if_(call(P_2,X), (Ts = [X|Ts0], Fs = Fs0),
(Ts = Ts0, Fs = [X|Fs0])),
tpartition_ts_fs_(Xs0,Ts0,Fs0,P_2).
if_(If_1, Then_0, Else_0) :-
call(If_1, T),
( T == true -> call(Then_0)
; T == false -> call(Else_0)
; nonvar(T) -> throw(error(type_error(boolean,T),_))
; /* var(T) */ throw(error(instantiation_error,_))
).
=(X, Y, T) :-
( X == Y -> T = true
; X \= Y -> T = false
; T = true, X = Y
; T = false,
dif(X, Y) % ISO extension
% throw(error(instantiation_error,_)) % ISO strict
).
equal_t(X, Y, T):-
=(X, Y, T).
%------------------------------------------------------------
%Predicate to pick up different elements between two lists.
displaydifference([],[],[]).
displaydifference(L1,L2,L4):-concatenate(L1,L2,L3), remove_dups(L3,L4).
concatenate(L1, L2, NL) :-
append(L1, L2, L12),
msort(L12, NL).
remove_dups([], []).
remove_dups([X], [X]).
remove_dups([X,Y|T], [X|R]) :-
X \= Y,
remove_dups([Y|T], R).
remove_dups([X,X|T], R) :-
skip(X, T, WithoutX),
remove_dups(WithoutX, R).
skip(_,[],[]).
skip(X, [X|T], T).
skip(X, [Y|T], [Y|T]) :- X \= Y.
不确定您到底想通过
searchdisease/2
获得什么
我假设您需要一个谓词,在给定症状列表的情况下,将第二个参数与一个或多个具有第一个参数超集的症状的疾病统一起来
既然如此,我提议
subList([], _).
subList([H | T], S) :-
member(H, S),
subList(T, S).
searchdisease(Symptoms, Disease) :-
disease(Ls, Disease),
subList(Symptoms, Ls).
如果你调用searchdisease([dordecabeca,Fedre,dormuscular,dorgarganta],Disease)
,你将Disease
与gripe
统一起来,因为[dordecabeca,Fedre,dormuscular,dorgarganta]
是gripe
症状的一个子集
如果你调用searchdisease([febre],D)
,你将D
与gripe
统一起来,并再次尝试回溯,dengue
,catapora
,caxumba
和resfriado
,因为febre
是这五种疾病的症状
顺便说一句:我不明白
症状/2
的用处;你为什么不简单地使用disease/2
?这样我就可以将我得到的列表与数据库中的所有列表进行比较,你知道吗?我的目标是将条目列表与所有列表进行比较,但列表并不总是相同的,也就是说,我将进行比较,直到找到与症状顺序无关的相应症状的正确疾病为止。@AndersonMendes您需要定义比较。子集?有一个非空的十字路口吗?有相同的元素集吗?…@Lowerer差不多就是这样,我对范围进行了更改。max66被他的谓词逗乐了,现在我明白了在子列表之间走动是如何工作的。非常感谢。