在查看文件时,参数未充分实例化。

3

我正在终端上运行SWI-Prolog,在Mac电脑上。我正在尝试通过在终端打开swipl后写入通常的命令来访问Atom文件:

?- [hwk1-my_name].

与其说swipl拥有可以操作的知识库,不如说它给了我这个:

ERROR: Arguments are not sufficiently instantiated

我对Prolog很陌生,目前我的程序只是教授提供的复制粘贴代码来开始作业。这是否意味着错误很可能是由下面的代码中的某些内容引起的?如果是这样,是什么导致了这个错误?以下是教授提供给我的代码:

father(Dad, Child) :-
   parent(Dad, Child),
   male(Dad).

mother(Mom, Child) :-
   parent(Mom, Child),
   female(Mom).

had_a_child(Man, Woman) :-
   father(Man, Child),
   mother(Woman, Child).

sibling(Sibling1, Sibling2) :-
   parent(Parent, Sibling1),
   parent(Parent, Sibling2),
   Sibling1 \= Sibling2.

brother(Brother, Sib) :-
   sibling(Brother, Sib),
   male(Brother).

sister(Sister, Sib) :-
   sibling(Sister, Sib),
   female(Sister).

2
还有这个要注意:如果你的教授使用了father_of/2而不是仅仅的father/2,那么哪个参数表示父亲就会更加清晰明了! - mat
@WillNess。添加一个标签来表示不充分的实例化是好的,但我想知道“non-instantiated-argument”是否是一个好的标签名...就我个人而言,我更倾向于使用instantiation-erroruninstantiation-error(请参见https://www.complang.tuwien.ac.at/ulrich/iso-prolog/error_k!)。它们在[标签:ISO-Prolog]中被使用,并且它们告诉了期望的特性(例如`uninstantiation`),其不存在会导致错误。 - repeat
@repeat 无论你们决定什么都可以,我现在不会再标记任何问题了。 :) - Will Ness
1
@WillNess。请放心,我并不是想通过批评你提出的标签来贬低你——相反,非常感谢你采取主动行动并推动事情的发展!请继续参与讨论。关于这个标签名称的寻找任务,你可以在meta.SO上发布一个问题吗?(meta.SO是否是正确的地方?) - repeat
2
我绝对赞同Will Ness和您的观点,这个标签很好。instantiation-error是一个很好的名字。uninstantiation-error表示相反的意思,即过多实例化,并且期望较少(即“un”)的实例化。许多遇到“参数未充分实例化”问题的用户在算术(主要是整数)方面遇到这些问题,并且从被告知关于CLP(FD)的信息中获益匪浅,因此在其中一些问题中,我还添加了[tag:clpfd]标签以及一个响应,显示如何使用纯方法解决该问题。 - mat
显示剩余5条评论
1个回答

6
你显然的问题在于文件名中包含了连字符-,你所使用的文本编辑器并不重要,甚至会产生混淆,因为Prolog的数据类型之一是原子
你有两个选项:
  1. 使用文件名作为Prolog原子的有效命名方式,这意味着文件名不能以大写字母或数字开头,只能包含字母、数字和下划线_。然后,您的文件仍然可以使用 .pl 扩展名并像这样进行查询:foo.pl ---> ?- [foo].

  2. 使用完整的文件名,包括扩展名,并在它周围加上单引号:foo-bar.baz ---> ?- ['foo-bar.baz'].。如您所见,您不再需要使用 .pl 扩展名。

每当您对Prolog看到的内容感到疑惑时,可以尝试使用write_canonical/1

?- write_canonical(hwk1-my_name).
-(hwk1, my_name)
true.

换句话说,Prolog将它视为一个复合项-/2,其中原子hwk1my_name分别作为第一和第二个参数。

非常感谢!问题已解决。 - quantumferret
1
@quantumferret 很高兴能够帮忙。我确定你的问题是一个重复的问题,因为这个问题经常出现。我会编辑你的标题,以便更容易找到。 - user1812457
是的,我不确定要使用什么术语。现在问题已经发布,我在“相关”部分看到可能的重复:/ - quantumferret
1
正如预期的那样:?- [hwk1-my_name]。错误:类型错误:期望 \file_path',但发现 `hwk1-my_name'(一个复合体)`。我想知道 OP 的问题是否真的是所报告的问题。 - CapelliC
1
@CapelliC老版本。我记得以前遇到过这个错误:不记得是什么时候了。 - user1812457
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接