Prolog 断言所有不同的可能性

Prolog 断言所有不同的可能性,prolog,Prolog,我有这个代码,它根据其他事实的列表断言事实,但是我很难做两件事: 首先,我想让它断言所有不同的可能事实 其次,我希望它能够使用可变长度的列表。我的代码只有在列表长度正好为2和4的情况下才有效,这对测试有效,但在实践中不起作用 assert_test([Fact], [Z,Z2], [Y, Y2, Y3, Y4]) :- Z, Z2, Y, Y2, Y3, Y4, assertz(Fact). 我真的不知道我需要什么样的解决方案来解决我的问

我有这个代码,它根据其他事实的列表断言事实,但是我很难做两件事:

首先,我想让它断言所有不同的可能事实

其次,我希望它能够使用可变长度的列表。我的代码只有在列表长度正好为2和4的情况下才有效,这对测试有效,但在实践中不起作用

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
的方法不同