Prolog:如何从复杂的术语中提取列表

时间:2014-08-13 09:26:17

标签: list prolog

我的任务是扩展一些现有的Prolog代码,我遇到了一个复杂术语结构的问题。 这个复杂的术语作为参数传递给我正在编写的Prolog谓词。问题是我需要从这个复杂的术语中提取两个列表,并且该术语的结构在高级或固定中是未知的。

具体来说,让我说我有一个术语" Param"像这样:

lam(_G23075,
   drs([_G23084], [eq(_G23084, person), ant(_G23084, mask, sg)])+_G23075*_G23084)

上面的drs术语有两个我想提取的列表。

如果Param只有drs术语,我可以这样做:

drs(L1, L2) = Param.

然后L1和L2将包含列表。 这怎么可能与上面给出的复杂的术语结构一起工作?

干杯,

马丁

2 个答案:

答案 0 :(得分:3)

你可以解构这个术语,例如与=..

以下谓词extract_drs(+Term,-L1,-L2)返回两个出现的列表。如果存在多个匹配项,则可能有多个解决方案。

extract_drs(drs(L1,L2),R1,R2) :- !,R1=L1,R2=L2. % the cut avoids that L1 or L2 are inspected
extract_drs(Term,L1,L2) :-
  compound(Term),           % check if it is a compound term and not a number, variable, etc.
  Term =.. [_Functor|Args], % get the arguments of Term
  member(Arg,Args),         % choose one argument
  extract_drs(Arg,L1,L2).   % and try to extract there the drs term       

答案 1 :(得分:1)

我会写

extract_drs(Term,L1,L2) :-
  compound(Term), (Term = drs(L1,L2) ; arg(_,Term,Arg), extract_drs(Arg,L1,L2)).
如danielp所述,

编辑,它是一个SWI_prolog扩展,允许使用带有第一个参数unbound的arg / 3。然后应该用

代替
extract_drs(Term,L1,L2) :-
  compound(Term), (Term = drs(L1,L2) ; Term =.. [_|Args], member(Arg,Args), extract_drs(Arg,L1,L2)).