我的任务是扩展一些现有的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将包含列表。 这怎么可能与上面给出的复杂的术语结构一起工作?
干杯,
马丁
答案 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)).