Prolog 断言所有不同的可能性
我有这个代码,它根据其他事实的列表断言事实,但是我很难做两件事: 首先,我想让它断言所有不同的可能事实 其次,我希望它能够使用可变长度的列表。我的代码只有在列表长度正好为2和4的情况下才有效,这对测试有效,但在实践中不起作用Prolog 断言所有不同的可能性,prolog,Prolog,我有这个代码,它根据其他事实的列表断言事实,但是我很难做两件事: 首先,我想让它断言所有不同的可能事实 其次,我希望它能够使用可变长度的列表。我的代码只有在列表长度正好为2和4的情况下才有效,这对测试有效,但在实践中不起作用 assert_test([Fact], [Z,Z2], [Y, Y2, Y3, Y4]) :- Z, Z2, Y, Y2, Y3, Y4, assertz(Fact). 我真的不知道我需要什么样的解决方案来解决我的问
assert_test([Fact], [Z,Z2], [Y, Y2, Y3, Y4]) :-
Z,
Z2,
Y,
Y2,
Y3,
Y4,
assertz(Fact).
我真的不知道我需要什么样的解决方案来解决我的问题,我真的很感激任何能帮助我走向正确方向的指针。这个问题不是很清楚,但似乎你想(a)调用一些作为列表传递的目标,然后(b)声明所有这些目标。我将在假设这是真的情况下回答,尽管这种书面操作几乎肯定没有用处 要调用某个变量
V
,您可以将V
作为规则体中的一个目标,就像您所做的那样,或者您可以对其应用call/1
谓词,即写入call(V)
。因此,要调用目标列表,可以执行maplist(call,goals)
类似地,要断言目标列表,可以执行maplist(assertz,goals)
因此,总的来说,这里有一种方法可以满足您的需求:
test_assert(Goals) :-
maplist(call, Goals),
maplist(assertz, Goals).
这适用于任何长度的目标列表
如果Prolog没有maplist/2
的实现,或者您不想使用它,您可以编写递归解决方案,例如:
test_assert([]).
test_assert([Goal|Goals]) :-
call(Goal),
assertz(Goal),
test_assert(Goals).
(这些都没有经过测试。)请注意,这会交错调用和断言操作,因此它们的执行顺序与使用maplist/2
的方法不同