我已经开始尝试了解Prolog的工作原理的短暂旅程,我需要一些帮助来试图弄清楚如何解决问题以及代码的实际作用。我想从序言中构建一个句子,就像一个超级基本的例子一样,我不想写一个'you are'
和'you art'
这样的句子。
这些是我的谓词:
line(you,[first, type]).
line(thee,[first,old]).
line(thou,[first, new]).
line(are, [second, word]).
line(art, [second, word]).
line(aurt, [second, place]).
然后我创建了一条规则(我知道这是错误的,但我不知道为什么):
line(A, [composed, type]):-
line(B, [first, type]),
line(C, [second, word]),
append([B,C],A).
键入命令行:
?- line(A, [composed, type]).
false.
但是对我来说不直观的是输入类似以下内容的
?- line(A, [first,type]).
A = you ;
false.
?- line(A, [second,word]).
A = are ;
A = art ;
false.
给我我想要的话。有人可以帮我更好地理解我应该如何编写规则的方式,以使我的预期结果类似于:
findall(X, line(X, [composed, type]),Y).
Y= you are;
Y= you art;
false.
我希望这有点道理,并且我没有在最后的代码块中完全混淆Prolog语法。先感谢您。
答案 0 :(得分:0)
我将向您介绍解决DCG的正确方法:
sentence --> noun, verb.
noun --> [you].
verb --> [are].
verb --> [art].
现在,您只需使用DCG驱动程序phrase/2
即可生成句子:
?- phrase(sentence, X).
X = [you, are] ;
X = [you, art].
您在[first, type]
和[second, word]
那里所拥有的东西,在理解上有些困难。但是DCG是执行此类轻量级NLP任务的好方法。