2016-01-23 24 views
2
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做了什么?请解释这个prolog代码的作用

第二个子句的格式做什么(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. 

如果你能解释一下这个非常简单,我会非常高兴。我只需要真正理解序言中的列表,剩下的语言对我来说就不再需要了(希望只要我活着)。

+1

请放心,这段代码不会对你做任何事 – Marged

+0

我现在修复了:) – sweetsm

回答

2

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

不正确。它只能是I = 2 .(第一次是什么由序言时停止。当Prolog是准备进行,I = 2 _印刷第二印刷和.停止它。)

但也可以是

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

i(A,B,C)是一个关系是CA若干B发生,计数任选。如果找到,第二条款会计算它;第三不。什么都不排除HX匹配相同的数字。

望着BY子句此谓语从句,它读取:

  • 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. 

澄清这一些。