断言所有不同的可能性

时间:2018-04-23 04:48:16

标签: prolog

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

首先,我希望它能够断言所有不同的可能事实。

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

assert_test([Fact], [Z,Z2], [Y, Y2, Y3, Y4]) :-
    Z,
    Z2,
    Y,
    Y2,
    Y3,
    Y4,
    assertz(Fact).

我真的不知道我的问题需要什么样的解决方案,我真的很感激任何可以帮助我朝正确方向发展的指针。

1 个答案:

答案 0 :(得分:0)

这个问题不是很清楚,但似乎你想(a)将一些目标称为列表,然后(b)断言所有这些目标。我将在假设这是真的的情况下回答,尽管这样写的操作几乎肯定没用。

要调用某个变量V,您只需将V作为目标放在规则体中,就像您一样,或者您可以将call/1谓词应用于它,即写call(V)。因此,要调用目标列表,您可以执行maplist(call, Goals)

同样,要声明目标列表,您可以执行maplist(assertz, Goals)

总的来说,这是一种做你想做的事情的方法:

test_assert(Goals) :-
    maplist(call, Goals),
    maplist(assertz, Goals).

这适用于任何长度的列表Goals

如果您的Prolog没有maplist/2的实现,或者您不想使用它,您可能会编写一个递归解决方案,例如:

test_assert([]).
test_assert([Goal|Goals]) :-
    call(Goal),
    assertz(Goal),
    test_assert(Goals).

(这些都没有经过测试。)请注意,这会对调用和断言操作进行交错,因此它们的执行顺序与使用maplist/2的方法不同。