arun@cwruecmp.UUCP (Arun Lakhotia) (05/09/87)
While the subject of meta-interpreters is still on, let me give an interesting coffee time puzzle. solve(true,true). solve((GoalA,GoalB),(GoalC,GoalD)):- solve(GoalA,GoalC), solve(GoalB,GoalD). solve(GoalA,GoalB) :- sys(GoalA), sys(GoalB), call(GoalA), call(GoalB). solve(HeadA,HeadB) :- clause(HeadA,BodyA), clause(HeadB,BodyB), solve(BodyA,BodyB). Q? For what class of programs would solve(GoalA,GoalB) be equivalent to solve(GoalA), solve(GoalB). Q? If solve(GoalA,GoalB) is true then can one make any comment about the relation between the proof-tree, search tree for the two goals. with (or without :-)) respect to solve(GoalA) and solve(GoalB). Q? Can any comment be made about the relation between the clauses that are used for asserting GoalA and GoalB for solve(GoalA,GoalB) to be true. where solve(Goal) is as follows. solve(true). solve((GoalA,GoalB)) :- solve(GoalA), solve(GoalB). solve(Goal) :- sys(Goal), call(Goal). solve(Head) :- clause(Head,Body), solve(Body). BACKGROUND For people who may be interested in the source of this program. The program is the result of composition of meta-interpreters. I took the clause solve(GoalA,GoalB) :- solve(GoalA), solve(GoalB). and applied some simple fold/unfold transformation on it, with a strategy to unfold the same clause for both the goals simultaneously. With a little more story i got the program solve(GoalA,GoalB). The complete semantics of the program is still a puzzle to me. One statement that i could make is solve(GoalA,GoalB) implies (solve(GoalA), solve(GoalB)) = Have Fun Arun Lakhotia UUCP : ..!cbatt!cwruecmp!arun Csnet : arun@case Arpanet: arun%case@csnet-relay