Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Prolog 写谓词_Prolog - Fatal编程技术网

Prolog 写谓词

Prolog 写谓词,prolog,Prolog,我是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.

我是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).

我的程序运行得很好,但我遇到的问题是,当我键入诸如“goodvegies(broc,tomato)”之类的内容时,我的程序崩溃了。我不知道如何过滤掉我不想要的结果,以便程序正常运行。

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

goodveggies(X,Y) :- goodveggies(X,Y).
这根本没有意义,因为好蔬菜
(X,Y)
如果是真的,那么它似乎是真的。此外,如果您想查询
好蔬菜(花椰菜、西红柿)
,它将有以下无限执行(添加备注):

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

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

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
定义好的蔬菜组合,第二个谓词
goodvegies/2
尝试查询两个订单,如果它们都失败,谓词结束

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

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

goodvegies(X,Y):-goodvegies(X,Y)。
是非常直接的自我参照。如果
X
Y
是好的蔬菜,那么
X
Y
就是好的蔬菜。无限循环。你想用这个规则说什么?而
好蔬菜
有两个参数在语义上意味着什么呢?@潜伏者:我想他想维护一个好蔬菜组合的数据库。@潜伏者:或者OP不熟悉最小世界假设。@CommuSoft目前,我倾向于你的第一个理论。:)@潜伏者:“或”并不是排他性的,我们毕竟是在谈论序言;)@JoffreyBaratheon:不,
奶奶(X,Y):-妈妈(X,Z),妈妈(Z,Y)。
你需要一个人在中间,你需要替换“或”
通过和
。你可以这样理解:
X
Y
的祖母,因为存在
Z
,因此
X
Z
的母亲,
Z
Y
的母亲。
goodveggies(broc,spinach).
goodveggies(broc,artichoke).