2

我正在尝试使用元编程和 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)) ]

谢谢你的时间。

4

1 回答 1

1

看起来你需要一个元解释器http://ktiml.mff.cuni.cz/~bartak/prolog/meta_interpret.html

最终,Prolog 中的所有问题都归结为使用正确的元解释器。

于 2013-01-18T14:24:09.993 回答