【发布时间】:2014-06-10 08:59:21
【问题描述】:
我们的 Prolog 课程有这个作业。经过两个月每周一小时的 Prolog,这对我来说仍然是一个谜,我的思维似乎无法适应程序语言。
有一个知识库,其中包含具有相同名称的谓词/函子和元数 1、2 和 3。 调用形式应该是
搜索(函子名称,参数,S)。
无论元数如何,答案都应该找到具有此函子名称和参数的所有事件。 答案应采用以下形式:
S = functor_name(argument);
S = functor_name(argument,_);
S = functor_name(_,argument);
S = functor_name(argument,_,_);
S = functor_name(_,argument,_);
S = functor_name(_,_,argument);
false.
我发现我可以使用 call 来测试知识库中的条目是否存在。
但是 call 似乎不适用于函子名称的变量。我完全感到困惑,不知道如何使用变量作为仿函数名称。
更新:
我的问题已部分回答。 我的新代码给出了 1、2 和 3 的真假(见下文)。
search(Person,Predicate) :-
ID = Person, Key = Predicate, current_functor(Key,1),
call(Key,ID)
; ID = Person, Key = Predicate, current_functor(Key,2),
(call(Key,ID,_);call(Key,_,ID))
; ID = Person, Key = Predicate, current_functor(Key,3),
(call(Key,ID,_,_);call(Key,_,ID,_);call(Key,_,_,ID)).
更新2:
另一个部分答案出现了。那个给我 S 作为术语列表,但“其他”参数是占位符:
search2(Predicate, Arg, S) :-
( Arity = 2 ; Arity = 3 ; Arity = 4 ),
functor(S, Predicate, Arity),
S =.. [_,Predicate|Args],
member(Arg, Args).
结果非常好。仍然缺少:谓词不应该在括号内,其他参数应该从知识库中直接获取,而不是写成占位符。当前结果如下所示:
?- search2(parent,lars,S).
S = parent(parent, lars) ;
S = parent(parent, lars, _G1575) ;
S = parent(parent, _G1574, lars) ;
S = parent(parent, lars, _G1575, _G1576) ;
S = parent(parent, _G1574, lars, _G1576) ;
S = parent(parent, _G1574, _G1575, lars).
我放弃了这个问题,因为这个问题从一开始就以错误的方式提出。我应该更具体地问 - 我不能,因为我仍然不擅长 Prolog。
@false 对我帮助最大。我接受他的回答。
【问题讨论】:
-
-1 用于在收到答案后添加一个额外的、不相关的问题。已经有很多关于收集结果的问题。
-
那么,如果我没有找到答案,我宁愿写一个新问题吗?
-
如果您的原始问题得到回答,您应该接受最合适的答案,如果您有新问题,请发布新问题。在您认为可以接受之前,您不应将单个 SO 问题用作后续问题流。这不是论坛主题。它应该是(1)问一个具体的技术问题,(2)得到具体的答案。新问题需要单独发布。
-
好的,我的问题不好——太复杂了。我们甚至没有接近我想要的。我现在有两个部分答案需要合并。无论我接受哪一个,我都会对对方刻薄。 :(
-
如果 SO 允许您投票,即使您不能接受一个完整的答案,您也可以投票给每个有用的答案。
标签: variables prolog functor meta-predicate