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中的列表,目前我不需要其他语言(希望只要我活着)。
答案 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)
是一种关系C
是B
中A
的出现次数,可选。如果找到,则第二个条款计算它;第三个没有。没有任何内容可以阻止H
和X
匹配相同的数字。
查看这个谓词子句,它的内容如下:
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.
再阐明一点。