Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在prolog中浏览数据库_Prolog - Fatal编程技术网

如何在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被他的谓词逗乐了,现在我明白了在子列表之间走动是如何工作的。非常感谢。