我正在尝试使用元编程和 DCG 将列表转换为使用 Prolog 的子句列表。例如,我想把 [a, man, is, a, human] 变成 [ (human(X) :- man(X)) ]
我想我可以使用 =.. 从它们的组成部分列表中组成术语。例如,调用Term =.. [f,a,b,c]
会将 Term 绑定到f(a,b,c)
.
我的问题是尝试使用 DCG 将其结合起来。到目前为止,我已经使用 DCGs 来检查一个句子是否是有效的形式:
%% syllogism( +S )
% Holds if the sentence S is one of four syllogisms
% a B is a C
syllogism --> article, subject, is_, (article ; [] ), subject .
% some B is a C
syllogism --> some, subject, is_, (article ; [] ), subject .
% no B is a C
syllogism --> no, subject, is_, (article ; [] ), subject .
% some B is not a C
syllogism --> some, subject, is_, not, (article ; [] ), subject .
subject --> [X] .
some --> [some] .
is_ --> [is] .
article --> [a] .
article --> [every] .
not --> [not] .
no --> [no] .
但是,我正在尝试对其进行修改,以便在仍然依赖 DCG 的同时生成子句列表。
编辑:基本上我想要实现的是获取一个列表 L 并产生一个子句列表: [a, man, is, a, human] 应该产生 [man(X) :- human(X)]
同样: [no, B, is, a, C] 应该产生 [ (false :- B(X),C(X)) ]
谢谢你的时间。