0

我想在一系列步骤之后构造一个子句。例如,如果我验证一个条件,那么我断言一个子句的一部分。如果“笔是红色的”我得到:

color(pen, red)

如果“笔在桌子上”:

on(pen, table)

如果“桌子是蓝色的”:

color(table, blue)

最后我必须得到:

color(pen, red), on(pen, table), color(table,blue).

我想在外部文件中插入最后一个子句。我能怎么做?

编辑:

我插入与上述类似的文本并扣除这些单独的谓词:

第一color(pen,red),第二on(pen,table),第三color(table,blue)

我想获得一个条款:

text(t1):-  color(pen, red), on(pen, table), color(table,blue).

并且该子句必须插入到文件中。

输入:单个谓词。OUTPUT:一个包含所有谓词的子句。

4

1 回答 1

0

我会用 DCG 来解决这个问题。

sentence(S) --> color_statement(S) ; on_statement(S).

det --> [a].
det --> [the].

color_statement(color(Noun, Color)) --> det, [Noun], [is], color(Color).

color(Color) --> [Color], { color(Color) }.

color(red). color(blue).

on_statement(on(Noun, Place)) --> det, [Noun], [is,on], det, [Place].

这是假设您有某种标记化,但出于演示目的,您会发现这个“有效”:

?- phrase(sentence(S), [the,pen,is,on,the,bookshelf]).
S = on(pen, bookshelf).

毫无疑问,您需要为您的目的扩展这些规则。你可以通过搜索找到标记化的东西,只有你确切地知道你想要支持的名词和修饰符的种类,所以这实际上只是一个如何进行的草图。

从这里您将创建另一个规则来处理多个语句。

clause([]) --> [].
clause([S|Rest]) --> sentence(S), ['.'], clause(Rest).

测试它的工作方式如下:

?- phrase(clause(S), [the,pen,is,on,the,bookshelf,'.',the,pen,is,red,'.']).
S = [on(pen, bookshelf), color(pen, red)] 

所以这些是你想要的条款。现在您只需要一个谓词将它们组合在一起。

list_and([X,Y], (X,Y)).
list_and([X|Xs], (X,Rest)) :-  list_and(Xs, Rest).

clause_for(Name, Tokens, Predicate) :-
    phrase(clause(Parts), Tokens),
    list_and(Parts, AndSequence),
    Predicate = (Name :- AndSequence).

这基本上可以满足您的需求,但是您需要为谓词提供名称:

?- clause_for(bob, [the,pen,is,on,the,bookshelf,'.',the,pen,is,red,'.'], P).
P = (bob:-on(pen, bookshelf), color(pen, red))

希望这可以帮助!

于 2013-07-19T15:42:56.920 回答