如何翻译CLIPS中的C语言循环(do..while)



假设C中代码的以下部分:

void function(int n,int x)
{
int i,j;
int max=5;
int p[max]; // for example: p[max]={{100,1,100,3,10}};
...
...
for(i=0; i<n; i++)
if(i!=x)
{
j=i;
do
{
j=p[j];     
}
while(j!=x);
}
...
}

我在CLIPS中尝试了以下操作,但while循环中的条件是在[do]执行之前评估的,而在上面的C语言代码中,[do]在while循环之前执行的部分则不是这样:

(deftemplate q
(slot line (type INTEGER)(default 1))
(slot column (type INTEGER))
(slot value (type INTEGER))
)
(deffacts Data ; for example
(q (line 1)(column 1)(value 100))
(q (line 1)(column 2)(value 1))
(q (line 1)(column 3)(value 100))
(q (line 1)(column 4)(value 3))
(q (line 1)(column 5)(value 10))
)
(deffunction function (?n ?x)
(loop-for-count (?i 1  ?n)
(if (!= ?i ?x) 
then
(bind ?j ?i)
(while (!= ?j ?x) do
(do-for-all-facts ((?q q))
(and 
(= (fact-slot-value ?q line) 1)
(= (fact-slot-value ?q column) ?j)
)
(bind ?j (fact-slot-value ?q value))
) 
)
)
)
)

问题:这是一个正确的代码吗?欢迎任何帮助。提前谢谢。

Do。。。while不直接受支持,但您可以在while主体的末尾放一个break语句来实现该功能:

(deffunction function (?n ?x)
(loop-for-count (?i 1  ?n)
(if (!= ?i ?x) 
then
(bind ?j ?i)
(while TRUE do
(do-for-all-facts ((?q q))
(and 
(= (fact-slot-value ?q line) 1)
(= (fact-slot-value ?q column) ?j)
)
(bind ?j (fact-slot-value ?q value))
) 
(if (!= ?j ?x) then (break))
)
)
)
)

好的,通用的哑压倒解决方案:定义一个类似这样的宏(伪代码我从来没有完全掌握过lisp语法(

(defmacro do-while (@test @body) (
(body)
(while (!= ?j ?x) do (body))
))

我认为你甚至可以跳过中间人,直接将循环嵌入递归展开中,但我只是不知道如何迫使它尾递归。

相关内容

  • 没有找到相关文章

最新更新