我有这个代码根据其他事实列表断言事实,但是我很难做两件事:
首先,我希望它能够断言所有不同的可能事实。
其次,我希望它能够使用可变长度列表。我的代码只有在列表正好是2和4的长度时才有效,这可以用于测试,但在实践中不起作用。
assert_test([Fact], [Z,Z2], [Y, Y2, Y3, Y4]) :-
Z,
Z2,
Y,
Y2,
Y3,
Y4,
assertz(Fact).
我真的不知道我的问题需要什么样的解决方案,我真的很感激任何可以帮助我朝正确方向发展的指针。
答案 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
的方法不同。