Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.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
Variables 声明一个变量_Variables_Prolog - Fatal编程技术网

Variables 声明一个变量

Variables 声明一个变量,variables,prolog,Variables,Prolog,从高中起我就没有接触过Prolog,即使我试着去查找信息,也没用。下面的例子说明了我的问题: %% everybody():- [dana, cody, bess, abby]. %% Everybody = [dana, cody, bess, abby]. likes(dana, cody). hates(bess, dana). hates(cody, abby). hates(X, Y):- \+ likes(X, Y). likes_somebody(_, []):- fail.

从高中起我就没有接触过Prolog,即使我试着去查找信息,也没用。下面的例子说明了我的问题:

%% everybody():- [dana, cody, bess, abby].
%% Everybody = [dana, cody, bess, abby].

likes(dana, cody).
hates(bess, dana).
hates(cody, abby).

hates(X, Y):- \+ likes(X, Y).

likes_somebody(_, []):- fail.
likes_somebody(X, [girl | others]):-
    likes(X, girl) ; likes_somebody(X, others).

likes_everybody(_, []):- true.
likes_everybody(X, [girl | others]):-
    likes(X, girl) , likes_everybody(X, others).

maplist(likes_somebody, [dana, cody, bess, abby], [dana, cody, bess, abby]).
我该如何声明
所有人
都只是女孩的名单?注释行是我尝试过的,但我得到了奇怪的错误消息


这是我到目前为止或多或少遵循的原则。如果有什么不同的话,我用的是GProlog。很抱歉问了这么一个基本的问题。GProlog的手册不涉及语言语法,但我肯定已经看过了。顺便说一句,如果您能告诉我在哪里可以找到语言文档(相对于实现文档),我将不胜感激。

Prolog中的每个变量都必须以大写字母开头。因此,对于初学者,您需要的是
所有人
,而不是
所有人

第二个问题,Prolog中的变量不是。因此,你可能想做的是制造一个事实,并用它来代替:

everybody([dana, cody, bess, abby]).
您的代码底线实际上是一个事实定义,将尝试覆盖
maplist/3
。您可能想做的是将该行上方的所有内容放入一个文件(例如,名为
likes.pl
)中,然后查询它(
[likes].
)。然后可以运行如下查询:

?- everybody(Everybody), maplist(likes_somebody, Everybody, Everybody).
girl(dana).
girl(cody).
girl(bess).
girl(abby).
everybody(Everybody), maplist(likes_somebody, Everybody).
这行不通,因为
喜欢/2
在第二个参数中处理列表。对于
likes\u someone/2
的谓词可以写成:

likes_somebody(_, []).
但还是没什么意义。它只是将任何内容与空列表统一起来:

?- likes_somebody(chicken_tacos, []).
true.
如果某人是女孩,你真的需要一个谓词来告诉你,比如:

?- everybody(Everybody), maplist(likes_somebody, Everybody, Everybody).
girl(dana).
girl(cody).
girl(bess).
girl(abby).
everybody(Everybody), maplist(likes_somebody, Everybody).
然后你可以做我认为你想做的事,这更接近于:

likes_somebody(X) :- girl(X).
然后,映射列表构造将如下所示:

?- everybody(Everybody), maplist(likes_somebody, Everybody, Everybody).
girl(dana).
girl(cody).
girl(bess).
girl(abby).
everybody(Everybody), maplist(likes_somebody, Everybody).
这将返回真值。你可以通过使用findall(Girl,Girl(X),everybody)
来简化和消除
everybody/1

你试图用
likes\u everybody/2
来处理列表,但它被破坏了,因为
girl
实际上是
girl
,而不是一个变量,
others
实际上是
others
,而不是某种可能是另一个列表尾部的列表


我认为你仍然有一些旧想法需要清理。再多读一些,再写一些,你的代码就会变得更有意义。

是的,对不起,我不得不在
映射列表
前面加上
?-
,是的,我对Prolog最接近的默认是通过Erlang,所以我知道关于变量名的语法规则。您所做的谓词并不是我真正想要做的,但是感谢您的努力:)您使用了
finall
-您如何知道现有函数的名称?我找不到任何关于这方面的信息……因为
girl
在你的谓词中出现了很多,但不是在你的数据库中,我假设你试图将它作为变量使用(而
其他人
如果不作为变量,就无法真正在该位置工作)。除此之外,您的问题是如何使
Everyone
成为变量,而不是
Everyone
--我强烈建议实施。哦,是的,对不起,我必须解决这个问题。好吧,我想这件事已经结束了,尽管它在我的整个生活中看起来仍然很难看:(Prolog的美学需要一些时间来适应。)我建议用比例字体编辑它。Prolog中的每个变量都必须以大写字母或下划线开头。后者是您通常向Prolog的日本用户教授的规则。