3

我正在通过终端在 Mac 上运行 SWI-Prolog。在终端中打开 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).
4

1 回答 1

6

您明显的问题是-文件名内部。您使用的文本编辑器完全无关紧要。甚至令人困惑,因为 Prolog 的数据类型之一是atom

你有两个选择:

  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作为第一个和第二个参数。

于 2016-02-05T07:22:26.697 回答