Prolog中的自编事实?

时间:2015-10-20 19:26:04

标签: reflection prolog

如何在Prolog中编写代码来生成事实以响应用户的输入,而无需手动编写?

例如,我给出了输入:

约翰尼喜欢莎莉。 凯伦喜欢鲍勃。

该计划应通过创建事实来回应

loves(Johnny, Sally).
loves(Karen, Bob).

我该怎么做?

1 个答案:

答案 0 :(得分:0)

当然,你需要为你要显示的输入示例编写一个解析器,然后将它们转换为可以使用assertz作为@EugeneSh声明的事实。已表示。

假设您已经解析了输入,并且在变量Verb中有“动词”或谓词标识符,并且您在列表Args中有参数。然后你就可以这样做:

Fact =.. [Verb | Args],
assertz( Fact ).

=../2运算符对应一个带有列表的术语。例如:

| ?- foo(a, b) =.. L.

L = [foo,a,b]

yes
| ?- Term =.. [foo, x, y].

Term = foo(x,y)

yes
| ?-

正如我在评论中提到的,如果您希望将这些作为特定事实,则需要确保您的谓词标识符和参数是基础术语(不包含变量)。原子需要以小写字母开头,或者您必须将其放在单引号中。有效原子:foobAr'Sam'。以下是变量:FOOSam