Swi-Prolog:无权修改静态过程

时间:2012-07-19 04:02:54

标签: prolog

我是初学者。我真的很感激编译这个例子的任何帮助。我猜规则的形式是“结果: - 先前”

%rules
prey(Y2), watch(X2,Y2) :- predator(X2).
false :- predator(X1),prey(Y1),intelligent(Y1),watch(X1,Y1),catch(X1,Y1).
catch(X3,Y3);hungry(X3) :- predator(X3),prey(Y3),watch(X3,Y3).

%facts
predator(shaki).
prey(pelusa).
intelligent(shaki).
intelligent(pelusa).
watch(shaki,pelusa).

我使用SWI-Prolog版本5.10.4(i386,Ubuntu Natty Narwhal)编译代码:

swipl -s "pathofthecode.pl"

Swi-Prolog为第二条规则抛出了这个错误:

'$record_clause'/2: No permission to modify static_procedure `(;)/2'

谢谢azhrei,你说:“我想你想说的是X1将无法捕捉到Y1,即使X1是捕食者看着猎物Y1,因为Y1很聪明。”,是的,它是!!

我发现prolog有一些强烈的约束[1]:

  1. Prolog不允许“或”(析取)事实或结论。
  2. Prolog不允许“不”(否定)事实或结论。
  3. Prolog不允许大多数事实或结论具有存在量化。
  4. Prolog不直接允许二阶逻辑。
  5. 所以我改变了代码:

    %rules
    predator(X) :- prey(Y), watch(X,Y).
    catch(X,Y) :- predator(X),prey(Y),not(intelligent(Y)),watch(X,Y).
    hungry(X) :- predator(X),prey(Y),watch(X,Y),not(catch(X,Y)).
    
    %facts
    prey(pelusa).
    intelligent(shaki).
    intelligent(pelusa).
    watch(shaki,pelusa).
    

    我也尝试过使用:

     false :- predator(X),prey(Y),intelligent(Y),watch(X,Y),catch(X,Y).
    

    并且它编译,但是当prolog需要查找catch(X,Y)是否为真时,它不能,因为谓词不在规则中。

    -

    [1]。 Neil C. Rowe,网址:http://faculty.nps.edu/ncrowe/book/chap14.html

    注意:这个例子来自哥斯达黎加UCR的Yadira Solano教授课程

1 个答案:

答案 0 :(得分:4)

错误消息与您使用分号;有关。你无法重新定义它。

您也无法更改false谓词。所以我很惊讶你说这个编译:

false :- predator(X),prey(Y),intelligent(Y),watch(X,Y),catch(X,Y).

它不能为我编译。 :-)(SWI-Prolog)

在第二条规则中,我认为你想说的是: X1将无法捕捉Y1,即使X1是观察猎物Y1的捕食者,因为Y1是智能的。在这种情况下你需要:

catch(X,Y) :- ...,...,...,...,not(intelligent(Y)).

(正如你发现自己,并在你的帖子中编辑。: - )

注意:您提供的链接显示了一些在逻辑上等效的语句,但这并不意味着您可以在代码中使用它们,因为它们在Prolog中不是程序上等效的。您可以在查询中(在prolog提示符下)或规则正文中使用false;,但不能在规则头中使用。{/ p>