假设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))
))
我认为你甚至可以跳过中间人,直接将循环嵌入递归展开中,但我只是不知道如何迫使它尾递归。