我刚开始学习Prolog,因为人工智能非常有趣,并且与其他许多编程语言不同,我偶然发现了一个逻辑谜题:
http://www.brainbashers.com/showpuzzles.as
我想知道如何开始编写这样的谜题代码?
让我感到困扰的是,我们知道有错误信息,如何从一组人中严格选出这些错误信息?
回答:
假设我们有一组人Persons
和一组说谎者Liars
。你可以将问题分解为两个要求:
-
Liars
是Persons
的“子列表”:我们需要一个额外的谓词,例如sublist(Persons,Liars)
:sublist([],[]). % 基本情况:空列表sublist([H|T],[H|Rest]) :- sublist(T,Rest). % 子列表可能包含H ...sublist([_|T],Rest) :- sublist(T,Rest). % ... 也可能不包含
-
正好有四个说谎者:
length(Liars,4)
现在你可以用一个合取式将它们组合起来:
length(Liars,4),sublist(Persons,Liars)
我把length(Liars,4)
放在前面,因为它是确定的,而sublist/2
会创建选择点。