Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Prolog 用序言证明谋杀发生的证据_Prolog_Resolution_Proof - Fatal编程技术网

Prolog 用序言证明谋杀发生的证据

Prolog 用序言证明谋杀发生的证据,prolog,resolution,proof,Prolog,Resolution,Proof,任务: 你来到犯罪现场。你看到一扇破碎的窗户,一个血迹斑斑的窗户 斧头和尸体。一名嫌疑犯在离房子100米的地方被捕。你 在法庭上,必须向法官证明谋杀发生了 地点。当一具尸体、一个盗窃现场、一场谋杀案 工具和一名嫌疑犯被发现 以这样的方式重写Prolog谓词和事实中的上述语句 你们可以用矛盾和解决的方法来证明 发生了一起谋杀案 以下是我的知识库: brokenWindow. bloodiedAx. corpse. suspect. murderTool(bloodiedAx). burglar

任务:

你来到犯罪现场。你看到一扇破碎的窗户,一个血迹斑斑的窗户 斧头和尸体。一名嫌疑犯在离房子100米的地方被捕。你 在法庭上,必须向法官证明谋杀发生了 地点。当一具尸体、一个盗窃现场、一场谋杀案 工具和一名嫌疑犯被发现

以这样的方式重写Prolog谓词和事实中的上述语句 你们可以用矛盾和解决的方法来证明 发生了一起谋杀案

以下是我的知识库:

brokenWindow. 
bloodiedAx.
corpse.
suspect.

murderTool(bloodiedAx).
burglarySite(brokenWindow).
body(corpse).

murder :- 
        body(X),
        burglarySite(Y),
        murderTool(Z),
        suspect.
输出:

?- murder.
true
-> Singleton variables: [X,Y,Z]
这是正确的吗?另外,有人能给我解释一下如何通过矛盾和解决方法进行证明吗?

以下是我的方法:

首先:写下事实

evidence('broken_window').
evidence('bloodied_axe').
evidence('corpse').
evidence('suspect').
第二步:编写谓词法庭证明,它将接受零参数。谓词将使用findall查找所有可用的证据。它将保存列表证据列表中的所有可用证据

findall(A,evidence(A),EvidenceList),
第三:使用if-else检查如果所有的东西都可用,就意味着有足够的证据证明谋杀发生了,否则就没有足够的证据成员将检查列表中是否存在特定证据

    (   member('broken_window',EvidenceList),member('bloodied_axe',EvidenceList),
member('corpse',EvidenceList),member('suspect',EvidenceList)->  
        write('Enough Proof!'); write('Not Enough Proof!')).
第四:将代码放在一起

evidence('broken_window').
evidence('bloodied_axe').
evidence('corpse').
evidence('suspect').

    courtProof:-
        findall(A,evidence(A),EvidenceList),
        (   member('broken_window',EvidenceList),member('bloodied_axe',EvidenceList),
member('corpse',EvidenceList),member('suspect',EvidenceList)->  
        write('Enough Proof!'); write('Not Enough Proof!')).
示例: 让我们在事实中说,我只有3个证据(矛盾(不是目标):只有当所有4个都发生时,才能证明谋杀已经发生,但这里我们只有3个)
,然后:

evidence('broken_window').
evidence('bloodied_axe').
%evidence('corpse').    %Corpse not discovered yet.
evidence('suspect').

?- courtProof.
Not Enough Proof!
1true
evidence('broken_window').
evidence('bloodied_axe').
evidence('corpse').
evidence('suspect').

?- courtProof.
Enough Proof!
1true
现在我有了所有证据(分辨率(目标):所有项目都与证据列表中的元素匹配),然后:

evidence('broken_window').
evidence('bloodied_axe').
%evidence('corpse').    %Corpse not discovered yet.
evidence('suspect').

?- courtProof.
Not Enough Proof!
1true
evidence('broken_window').
evidence('bloodied_axe').
evidence('corpse').
evidence('suspect').

?- courtProof.
Enough Proof!
1true

这真是一个奇怪的练习。从某种意义上说,它要求你写一个(不是那么复杂)扫描身体+盗窃网站+谋杀工具+嫌疑人的事件,并在看到这些事件时发出“谋杀已经发生”的指示。所以在我看来没问题,但我不明白重点。老实说,我也是。尤其是因为我们之前的任务都是关于列表的。好吧,列表只是排列数据的一种独特方式。。。SWIPROlog增加了DICT(或者一个可以使用库(AsCOC)),这些可能也应该出现在一个过程中。在“矛盾和解决的证明”中,Prolog是这样做的,或者至少这是一个人可以在一个纯逻辑子集(没有调用,剪切,I/O,Meta Apple)中所做的事情。它在目标否定的情况下对从句进行增广,试图做一个“矛盾证明”。我想你是被要求亲自做这样的证明。当然,Prolog并没有真正做到这一点,我也不认为编程时有人会这么想。@DavidTonhofer你能给我解释一下如何做这样的证明吗?