我有一个带两个参数的谓词,其中第一个参数可以是复数,第二个参数始终是B。我还定义了一些新的运算符,例如 + 和& 。
pvc(A, B) :- somestuff(A, B).
用户可以在此处键入类似pvc((x+y)&(A+b), B)
的内容。
作为Prolog的初学者,我想做的是将化合物A
转换为所有小写字母,并使用新的somestuff
调用AN
。因此应为somestuff((x+y)&(a+b), B)
。
我尝试了类似pvc(A, B) :- downcase_atom(A,AN),somestuff(AN, B).
的方法
,但这似乎不是正确的方法。我将不胜感激。
答案 0 :(得分:2)
因此,您需要介绍事物的结构,最简单的方法是使用Uniiv运算符=../2
。首先处理您的基本情况,
downcase_compound(A, B) :- atom(A), downcase_atom(A, B).
现在,您将拆开结构并使用univ对其进行归纳:
downcase_compound(A, B) :-
compound(A),
A =.. [Functor|Args],
downcase_compound(Functor, DowncaseFunctor),
maplist(downcase_compound, Args, DowncaseArgs),
B =.. [DowncaseFunctor|DowncaseArgs].
这里的技巧只是将化合物分解成可以使用的位,然后递归调用这些位上的downcase_compound/2
。实际观看:
?- downcase_compound((x+y,('A'+b)), X).
X = (x+y, a+b)