【问题标题】:Writing a Predicate编写谓词
【发布时间】:2015-01-27 23:35:55
【问题描述】:

我是 Prolog 的新手,我正在尝试编写一个谓词 goodveggies(X,Y) 以便代码按以下方式运行:

?- goodveggies(broc,spinach).
true.
?- goodveggies(X,artichoke).
X = broc

我尝试过的:

% Define the facts:
  goodveggies(broc,spinach).
  goodveggies(broc,artichoke).     

  % Now make the predicate.
   goodveggies(X,Y) :- goodveggies(X,Y).

我的程序运行良好,但我遇到的问题是我的程序在我输入 goodveggies(broc, tomato). 之类的内容时崩溃我不明白如何过滤掉我不想要的结果以便程序正常运行。

【问题讨论】:

  • goodveggies(X,Y) :- goodveggies(X,Y). 是非常直接的自我引用。它说如果XY 是好蔬菜,那么XY 是好蔬菜。无限循环。你想用这条规则说什么? goodveggies 有两个参数在语义上意味着什么?
  • @lurker:我认为他想维护一个良好组合蔬菜的数据库。
  • @lurker: 或者 OP 不熟悉 最小世界假设
  • @CommuSoft 目前,我倾向于您的第一个理论。 :)
  • @lurker:“或”不是唯一的,毕竟我们说的是序言;)

标签: prolog


【解决方案1】:

我不明白你为什么要定义谓词

goodveggies(X,Y) :- goodveggies(X,Y).

这根本没有意义,因为 goodveggies (X,Y) 似乎是真的,如果它是真的。再者说要查询goodveggies(broc, tomato),会有如下无限执行(加注):

goodveggies(broc, tomato) :-
    goodveggies(broc, spinach); FAIL!
    goodveggies(broc,artichoke); FAIL!
    goodveggies(broc, tomato) :-
        goodveggies(broc, spinach); FAIL!
        goodveggies(broc,artichoke); FAIL!
        goodveggies(broc, tomato) :-
            goodveggies(broc, spinach); FAIL!
            goodveggies(broc,artichoke); FAIL!
            goodveggies(broc, tomato) :-
                ...

所以你一直在查询同样的事实。

您可能希望能够交换值出现的顺序,因此:

goodveggies(X,Y) :- goodveggies(Y,X).

现在这也不起作用,因为它会尝试:

goodveggies(broc,tomato) :-
       goodveggies(tomato,broc) :-
           goodveggies(broc,tomato) :-
               goodveggies(tomato,broc) :-
                   ...

但是,您可以通过定义 两个 谓词来解决这个问题:

gv(broc,spinach).
gv(broc,artichoke).

goodveggies(X,Y) :-
    gv(X,Y).
goodveggies(X,Y) :-
    gv(Y,X).

第一个谓词gv/2定义好的蔬菜组合,第二个goodveggies/2尝试查询两个订单,如果都失败,谓词结束。

在prolog中你必须明白的是,所有未指定为真的都是假的。这就是他们所说的最小世界假设。因此,如果您没有指定goodveggies(broc,tomato) 并且它不能由某些谓词派生,则程序将返回false。如果您不想有可变顺序,列出事实就可以了:

goodveggies(broc,spinach).
goodveggies(broc,artichoke).

【讨论】:

  • @JoffreyBaratheon: 不,grandma(X,Y) :- mom(X,Z), mom(Z,Y). 你需要一个中间人,你需要用和, 替换“或”;。你可以这样理解:XY 的祖母,假设存在Z 使得XZ 的母亲,ZY 的母亲。跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-04
  • 1970-01-01
  • 1970-01-01
  • 2013-06-11
  • 2015-02-25
  • 1970-01-01
相关资源
最近更新 更多