3

我是新手,也是我正在研究的 Prolog 的新手,特别是 SWI-Prolog。我正在尝试按照标题所述进行操作,并已使用 SWI 库中包含的一些方法使其在基于 1 的列表(从 1 而不是零开始)上工作。这是我的代码:

indexof(I,E,L):-
   nth1(I,L,E).
   indexof(-1,_,_).

我的任务(是的,它是 hw - _ -)是这样做的,但作为一个基于 0 的计数,我尝试在最后一行添加 I is I - 1 但我一直收到错误。有没有其他方法可以将其变为基于 0 的计数?

所以对于这个 indexof(A,a,[w,x,y,z,a])。我应该得到 4,但我得到 5。

4

2 回答 2

2

SWI-Prolog 的nth0/3nth1/3类似,但索引从 0 开始。

为了使您的原始方法有效,您需要以下内容:

indexof(I,E,L) :-
    nth1(I1,L,E),
    I is I1 - 1.

Prolog 变量只能分配一次。如果你尝试过I is I - 1,你声称它I本身就是负 1。这永远不会是真的,所以谓词失败了。您需要使用中间变量,I1如上例所示。

于 2012-10-25T14:24:22.143 回答
0

nth1/3的定义是nth1(?Index, ?List, ?Elem)。这?意味着不必实例化参数,因此 Prolog 将为您填充它,这意味着您甚至不必为此目的创建新的谓词!这是以这种方式使用内置nth1/3谓词的示例:

?- nth1(I, [1,2,3,1,3,4,5], 1).
I = 1 ;
I = 4 ;
false.

?- nth1(I, [1,2,3,1,3,4,5], 2).
I = 2 ;
false.

?- nth1(I, [1,2,3,1,3,4,5], 3).
I = 3 ;
I = 5 ;
false.
于 2022-02-19T11:19:38.587 回答