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

上一篇: Simple Main Predicate Example in Prolog

下一篇: building FSA in prolog