Prolog - 将列表转换为子句列表

时间:2012-11-20 20:42:31

标签: prolog dcg

我正在尝试使用元编程和DCG将列表转换为使用Prolog的子句列表。例如,我想把[a,man,is,a,human]变成[(human(X): - man(X))]

我认为我可以使用= ..从他们的列表中编写术语 组成部分。例如,调用Term =.. [f,a,b,c]会将Term绑定到f(a,b,c)

我的问题是尝试将其与DCG结合使用。到目前为止,我已经使用DCG来检查句子是否是有效的形式:

 %% 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)]

同样:[不,B,是,a,C]应该产生[(假: - B(X),C(X))]

感谢您的时间。

1 个答案:

答案 0 :(得分:2)

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

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