Prolog中的简单主谓词示例
我决定开始玩Prolog(SWI-Prolog)。 我写了一个程序,现在我正在尝试编写一个简单的主谓词,以便我可以创建一个.exe并从命令行运行该程序。 这样,我可以从命令行找到真实/错误的关系,而不是从prolog GUI。 但是,我无法理解主谓词中究竟发生了什么。 到目前为止,该计划是:
mother(tim, anna).
mother(anna, fanny).
mother(daniel, fanny).
mother(celine, gertrude).
father(tim, bernd).
father(anna, ephraim).
father(daniel, ephraim).
father(celine, daniel).
parent(X,Y) :- mother(X,Y).
parent(X,Y) :- father(X,Y).
ancestor(X, Y) :- parent(X, Y).
ancestor(X, Y) :- parent(X, Z), ancestor(Z, Y).
第一次尝试:
我把所有的关系定义放在一个名为family_func()
的谓词中。然后,我尝试通过输入main
从main调用该函数。 进入命令行。 我希望能够像我在创建谓词之前那样开始找到关系,但是相反,程序以这个错误开始:
ERROR: c:/.../ancestor.pl:18:0: Syntax error: Operator expected
代码如下:
family_func():-
mother(tim, anna).
...
parent(X,Y) :- mother(X,Y).
...
main:-
family_func().
第二次尝试:
我试着把所有的定义放在主谓词中。 我期望能够输入main。 然后让程序暂停并等待我开始输入子句(就像在Java中运行程序并等待用户输入一样)。 相反,当我输入main时,它返回false。
问题1:
我习惯用Java编写代码。 所以,在我看来,我尝试的第一件事情应该是工作。 我基本上在family_func()
定义了局部变量,然后我调用了更小的“方法”(即parent(X,Y) :- mother(X,Y).
),它应该找到这些变量之间的关系。 当我打电话给主人时,至少我会希望节目等待我进入关系,返回结果,然后关闭。 为什么这不起作用?
问题2:
我将如何写一个主谓词? 这样的程序有没有好的例子? 我在这里尝试过这个例子,但无法使它工作。
谢谢你的帮助。
编辑:
新的尝试 - main.
返回false,并运行parent(tim, anna).
在跑完main.
即使它是真实的,它也会返回false。
:- dynamic mother/2.
:- dynamic father/2.
family_func:-
assert(mother(tim, anna)).
assert(father(tim, bernd)).
parent(X,Y) :- mother(X,Y).
parent(X,Y) :- father(X,Y).
ancestor(X, Y) :- parent(X, Y).
ancestor(X, Y) :- parent(X, Z), ancestor(Z, Y).
main:-
family_func.
编辑:
为了防止其他人需要知道,正如@CapelliC在回答下的评论中所述,在呼叫之间需要逗号。 例如:
family_func:-
assert(mother(tim, anna)),
assert(mother(anna, fanny)),
assert(mother(daniel, fanny)),
assert(mother(celine, gertrude)),
assert(father(tim, bernd)),
assert(father(anna, ephraim)),
assert(father(daniel, ephraim)),
assert(father(celine, daniel)).
我认为应该是(不允许空的参数列表)
:- dynamic mother/2.
... other dynamically defined relations...
family_func:-
assert(mother(tim, anna)).
...
% rules can be dynamic as well, it depends on your application flow...
parent(X,Y) :- mother(X,Y).
...
main:-
family_func.
链接地址: http://www.djcxy.com/p/66943.html