逐步构造子句

时间:2013-07-19 08:49:33

标签: prolog

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

color(pen, red)

如果“笔在桌子上”:

on(pen, table)

如果“桌子是蓝色的”:

color(table, blue)

最后我必须得到:

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

我想在外部文件中插入final子句。我该怎么办?

编辑:

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

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

我想获得一个条款:

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

并且必须将此子句插入文件中。

INPUT:单个谓词。 输出:包含所有谓词的一个子句。

1 个答案:

答案 0 :(得分: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))

希望这有帮助!