请解释这个prolog代码的作用

时间:2016-01-23 20:01:50

标签: list prolog

i( [],_,0 ).
i( [H|T],H,I ) :- i( T,H,J ),I is J+1.
i( [H|T],X,I ) :- i( T,X,I ).

请解释这个prolog代码的作用。在第三个条款中X做了什么?

第二个子句中的格式是什么(T,H,J),什么进入J?

我的角色是什么?我只是存储答案吗?是最后一个"参数"像这样的条款只是一个答案的地方?

请您解释为什么我等于这些问题中给出的值。我完全很难理解序言,它与我曾经使用或看过的任何东西都有太大不同......

i( [ 1,2,3 ],0,I ). I = 0.
i( [ 1,2,1,2 ],1,I ).  I = 2.
i( [ 1,2,3,4 ],2,I ).  I = 1.
i( [ 5,3,3,4,2,2,3 ],3,I ). I = 3.

如果你能解释一下,我会非常高兴。我只需要理解prolog中的列表,目前我不需要其他语言(希望只要我活着)。

1 个答案:

答案 0 :(得分:2)

  

i( [ 1,2,1,2 ],1,I ).
I = 2.

不正确。它只能是I = 2 .(第一个是由Prolog打印的内容。第二个是在Prolog准备好继续,I = 2 _按下时打印的.阻止它。)

但它也可以

I = 2 ; I = 1 ; I = 1 ; I = 0.

i(A,B,C)是一种关系CBA的出现次数,可选。如果找到,则第二个条款计算它;第三个没有。没有任何内容可以阻止HX匹配相同的数字。

查看这个谓词子句,它的内容如下:

  • i( [],_,0 ).空列表中任何内容的可选计数为0。
  • i( [H|T],H,I ) :- i( T,H,J ), I is J+1.列表头部元素的可选计数是列表尾部的可选计数加1。
  • i( [H|T],X,I ) :- i( T,X,I ).列表中任意内容的可选计数与列表尾部的可选计数相同。

从语义上讲,这三个子句在列表上实现结构递归,该列表是关系的第一个参数。

在操作上,第一个子句只能成功一次,但如果第二个子句匹配,则第三个子句也将始终匹配,因此您始终处理相同的情况两次。将第3个子句重写为

i( [H|T],X,I ) :- i( T,X,J ), I is J+0.

再阐明一点。